3

for(int i(5) ; i-->0 ; ) { //use i as iterator here }

これと同じですか

for(int i=5; i>0 ; i--)??

Googleで同様の宣言を見つけようとしましたが、何も見つかりませんでした

また、同じことを宣言するよりクリーンな方法を提案してください。

4

4 に答える 4

8

いいえ、これらは同じではありません。最初のケースでiは、ループ本体が初めて実行される前にデクリメントされます。

実際のデモについては、 http://ideone.com/AbHF3mを参照してください。

于 2013-01-10T15:37:12.240 に答える
4

いいえ、同じではありません。最初のバージョンはデクリメント前の値を比較し、各反復のi にデクリメントを実行します。2 番目はデクリメント後の値を比較し、反復ごとにデクリメントを実行します。

したがって、最初は を反復し{4,3,2,1,0}、2 番目は を反復し{5,4,3,2,1}ます。

于 2013-01-10T15:38:33.523 に答える
4

それは同じではありません。最初のケースでは、 の値はi最初4の繰り返しと0最後の繰り返しになります。2 番目のケースでi5、最初の繰り返しと1最後の繰り返しになります。

編集

@Y.Ecarri の場合:

最初のケース:

  1. iに設定5
  2. 比較i > 0、つまり、5 > 0
  3. 減分しiます。i今でしょ4
  4. i値を持つループの本体を入力してください4
  5. ボディ仕上げ

2 番目のケース:

  1. iに設定5
  2. 比較i > 0、つまり、5 > 0
  3. i値を持つループの本体を入力してください5
  4. ボディ仕上げ
  5. 減分しiます。i今でしょ4
于 2013-01-10T15:37:54.147 に答える
0

順序は次のとおりであるため、他の人が指摘したものとは異なります。

  1. for ループの最初の部分 (最初のセミコロンの前) は、最初に 1 回だけ評価されます。
  2. 2 番目のセクションはコードのブロックの前に評価されますが、2 番目のセクションはまったく評価されず、ゼロ値 (false、null ポインター、または 0 の数値) が返されます。i-- > 0 として解析されるこのセクション内では、デクリメント後の演算子であるため、デクリメントの前に比較が行われます。したがって、私が最初に 1 だったときは true になりますが、次に来るもののために 0 に減少します。
  3. ループの本体。
  4. for ループの 3 番目の部分は、(ブレークまたはリターンで) 異常終了しない場合、ループのブロックの最後で実行されます。

iここのように符号付き int であり、-1 に達することができる場合は、次のように置き換えることができます

for( int i=4; i >= 0; --i ) { // body

その意図はもう少し明白に見えます。size_t などの unsigned int がある場合でも、順序を切り替えることで、その意図をもう少し明確に見せることができます。

for( size_t i = 5; 0 < i--; ) { // body

0 と比較を完全に削除して、次のようにすることもできます。

for( size_t i = 5; i--; ) { // body

i=5上記の2つの両方で、最初の反復で4として開始したいときに開始するという事実にまだ不快です。したがって、do...while. に切り替えることもできます。もちろんi、ループの外で初期化する必要があります。

size_t i = 5;
do { // body
    --i; // clearly 4 now on first iteration
} while( i != 0 );
于 2013-01-10T16:02:14.333 に答える