時間ループの中で、最後のコンマ分離ステートメントは最後に実行されることが保証されていますか?

StackOverflow https://stackoverflow.com/questions/4072578

質問

次の(些細な)コードセグメントを考えてみましょう。

while (i++, i <= 10) {
  // some more code
}

一般的なケースでは、C ++では、コンマ分離ステートメントを任意の順序で評価することができます。しばらくループの場合、最後のステートメント(ループの条件として使用される)が最後に評価されることを少なくとも(仕様によって)保証されていますか?

役に立ちましたか?

解決

一般的なケースでは、C ++では、コンマ分離ステートメントを任意の順序で評価することができます。

関数引数間のコンマを参照している場合、それは単なるセパレーターです。

あなたの場合、あなたはを使用しています コンマオペレーター, 、そして、それは、右のオペラを評価する前に、コンマの左オペランドからのすべての副作用が落ち着いたことを保証するシーケンスポイントを導入します。

そう、それは明確に定義されています。

ISO C ++ 98標準のセクション5.18/1から:

コンマで区切られた一対の式が左から右に評価され、左式の値が破棄されます。 lvalue-to-value(4.1)、配列からポインター(4.2)、および関数間(4.3)標準変換は、左式には適用されません。一時的な式(12.2)の破壊を除き、左式のすべての副作用(1.9)は、正しい式の評価の前に実行されます。結果のタイプと値は、適切なオペランドのタイプと値です。その結果、適切なオペランドがそうである場合、結果はLValueになります。

他のヒント

はい。 , オペレーター(過負荷でない限り!)は、いわゆるものを導入します シーケンスポイント そして、実際に左から右への実行順序を保証します。

上記のコメントが説明しました。そして、この方法を乱用する一般的な方法の1つは

while(scanf("%d", &n), n){
    // do something
}

これにより、ゼロを読み取るまで整数が読み取られます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top