私が知りたいのは、このステートメントが実行可能かどうかだけです
for(j = 2; (j <= i) && flag; j++)
flag
i
このループの前に初期化されます。私は前にそのようなものを見たことがありません。
一般的な for ループ条件は次のようになります:-
for(initialization ; condition; increment)
だからあなたがしていることは正しいです。
for ループを分解するということは、次のことを意味します。
for(j=2;(j<=i)&& flag ;j++)
初期化は j=2;
条件は (j<=i)&& フラグです。
インクリメントは j++
一例: -
int main(int argc, const char * argv[])
{
int sum = 0;
int j = 100;
for(int i = 1; i<=100/2 && j>100/2; i++){
sum += i+j;
j--;
}
return sum;
}
2 番目の例flag
:
バブル ソートを思い出してください。バブル ソートでは、2 つのネストされたループが必要です。外側のループはパス数に対して実行され、内側のループはペアごとにスワッピング タスクを実行しますa[i], a[i + 1]
。実行を保存するために、いくつかのフラグ変数を利用できます。一部のパスでスワッピングが行われなかった場合、これは次のパスを実行する必要がなく、ソートが完了したことを意味します。以下をお読みください:バブルソートの最適化:
これをコード化します:
FLAG = 1;
for(i = 0; FLAG && (i < n - 1); i++){//If flag = ), break outer loop sorting done
FLAG = 0; // set flag = 0
for(j = 0; j < n - 1 - i; j++){
if(arr[j] > arr[j + 1]){
swap(arr[j], arr[j + 1]);
FLAG = 1; // if any swapping need, then check in next round
}
}
}
外側のループの状態FLAG && (i < n - 1)
に注意してください。これはあなたが望んでいるものだと思います。この助けを願っています!