12

次の(些細な)コードセグメントについて考えてみます。

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

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

4

3 に答える 3

18

一般的な場合、C ++では、コンマ区切りのステートメントを任意の順序で評価できます。

関数の引数の間のコンマを参照している場合、それは単なる区切り文字です。

あなたの場合、コンマ演算子を使用しています。これにより、右のオペランドを評価する前に、コンマの左のオペランドからのすべての副作用が解決することを保証するシーケンスポイントが導入されます。

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

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

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

于 2010-11-01T20:00:40.700 に答える
11

はい。演算子(オーバーロードされていない限り!)は,、いわゆるシーケンスポイントを導入し、実際に左から右への実行順序を保証します。

于 2010-11-01T19:59:54.413 に答える
4

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

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

これは、ゼロを読み取るまで整数を読み取ります。

于 2014-02-22T20:58:02.833 に答える