5
int c = someIntegerValue;

// Some code...

int i;
for ( i = 0; i < 5, i < c; i++ ) {
...
}

私のコンパイラは と言っていますがerror: expression has no effect、これはほぼ正しいように聞こえます。では、これら 2 つの比較のどちらをここで使用しますか? 私の推測でi < cは無視されますが、私はまだこのコードを実行する立場にないので、他の人からの確認が必要でした...

4

6 に答える 6

14

ステートメント

i < 5, i < c

コンマ operatorを使用します。これは、すべての式を左から右に評価しますが、一番右の式の値のみを生成します。これは、式i < 5が評価されて破棄される一方で、式i < cが評価されてループによって実際に使用されることを意味します。

著者は次のようなことを書きたかったのだと思います。

i < 5 && i < c

実際には両方の式を考慮しています。

とはいえ、なぜこれがコンパイラエラーであり、コンパイラ警告ではないのかはわかりません。これは合法的なコードですが、ほぼ間違いなくバグです。おそらく、警告時にエラーを報告するようにコンパイラを設定していませんか?

お役に立てれば!

于 2013-06-10T20:53:46.143 に答える
7

それはコンマ演算子です。左オペランドと右オペランドを (常にその順序で) 評価し、右オペランドの結果を生成します。左オペランドがその副作用のために評価される場合、それを使用することは理にかなっています。i < 5副作用がないため、コンパイラはそれについて警告します。

それは、無視されているi < 5わけではありません。i < cコードは次と同等です。

for ( i = 0; i < c; i++ ) {
     ...
}

それが何を意図していたのかを推測するのは難しい。おそらく、著者は実際には次のことを意図していたのでしょう。

for ( i = 0; i < 5 && i < c; i++ ) {
    ...
}
于 2013-06-10T20:54:18.163 に答える
3

コンマ演算子の結果は、右側のオペランドの値です。

ここで、左オペランド ( i < 5) には副作用がないため、

i < 5, i < c

実際には同等です

i < c
于 2013-06-10T20:54:22.520 に答える
3

i < 5無視されているということです。

完全な式は次のとおりです。

i < 5, i < c

これは、コンマ演算子で結合された 2 つの別個の式です。

コンマ演算子は、最初の式 ( i < 5)、次に 2 番目の式 ( i < c) を評価することによって機能し、完全な式は 2 番目の部分の値を取ります。

式の最初の部分は、副作用がある場合にのみ問題になります。

これは一般的に、次のように正しく使用されます

for(i = 0, j = 10; i < 10; ++i, --j)
/* i goes from 0-10, while j goes from 10-0 at the same time */

しかし、あなたのコードに示されている方法では、意味のある目的がなく、他の人を混乱させるだけです.

于 2013-06-10T20:53:24.430 に答える
2

コンマ演算子を使用した結果です。左の式が評価され、結果が破棄されます。その後、正しい式が評価されます。コンマ演算子の結果は、正しい式の結果です。

左の式 ( i < 5) はノーオペレーションであるため、表示されている警告が表示されます。ここで問題になるのは、「作者は何を意図したのか」ということです。これ以上のコンテキストがなければ、実際には言えませんが、次のいずれかである可能性があります。

  i < 5
  i < c
  i < 5 && i < c
于 2013-06-10T20:54:27.013 に答える