次のようなコードを作成しました。
int foo, bar1 = 4, bar2 = 7;
foo = bar1, bar2; // Look at this expression.
printf("%d", foo);
-Wallおよび-Wextraを使用して、GCC でコンパイルしました。出力は でした4
。
醜いことは別として、この式は未定義の動作ですか、それともfoo
常にに設定されていbar1
ますか?
次のようなコードを作成しました。
int foo, bar1 = 4, bar2 = 7;
foo = bar1, bar2; // Look at this expression.
printf("%d", foo);
-Wallおよび-Wextraを使用して、GCC でコンパイルしました。出力は でした4
。
醜いことは別として、この式は未定義の動作ですか、それともfoo
常にに設定されていbar1
ますか?
これはコンマ演算子foo = (bar1++, f(bar2));
であり、主に which incrementsのような副作用のある式で役立ち、bar1
関数f
を呼び出しbar2
てその結果をに設定しますfoo
Cでは、コンマ演算子は代入よりも優先順位が低くなります。
一般e1,e2
に (式のコンテキストで) 左のオペランドを評価し、e1
その結果を破棄e2
してから、右のオペランドを評価し、右のオペランドの値を (式全体の値としてe1,e2
) 与えます。
Ocaml には;
演算子があり、Scheme には がありbegin
、Lisp にprogn
は同様の目的があります (副作用のために 2 つまたは複数の部分式を評価し、最後のものを結果全体として与える)。