web-dev-qa-db-ja.com

if条件のコンマ演算子

int a = 1, b = 0;

if(a, b)
   printf("success\n");
else
   printf("fail\n");

if(b, a)
   printf("success\n");
else
   printf("fail");

これはcppファイルであり、Visual Studio2010で次のように出力を取得しました。

fail
success

なぜこの振る舞い?説明してもらえますか?

19
indira

http://en.wikipedia.org/wiki/Comma_o​​perator

CおよびC++プログラミング言語では、コンマ演算子(トークン,で表される)は、最初のオペランドを評価して結果を破棄し、次に2番目のオペランドを評価してこの値(およびタイプ)を返す2項演算子です。 。

最初のif

if (a, b)

aが最初に評価されて破棄され、bが2番目に評価されて0として返されます。したがって、この条件はfalseです。

2番目のif

if (b, a)

bが最初に評価されて破棄され、aが2番目に評価されて1として返されます。したがって、この条件は真です。

オペランドが3つ以上ある場合は、最後の式が返されます。

両方の条件を真にしたい場合は、 &&演算子 を使用する必要があります。

if (a && b)
50
Yang

ウィキペディアが提供する別のユースケースを示す例を次に示します。

条件(if、while、do while、またはfor)内でコンマを使用すると、補助計算、特に関数の呼び出しと結果の使用、およびブロックスコープを使用できます。

if(y = f(x)、y> x){... // xとyを含むステートメント}

// このウィキペディアのディスカッションを参照

多くのCプログラマーは、forステートメントの初期化子部分でコンマに遭遇しましたが、ifステートメントで使用されているのを見た人はそれほど多くありません。上記の場合、ifステートメントが条件y> xをテストする前にyを初期化できます。

1
jmkuss