次のようなコードを作成しました。
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 つまたは複数の部分式を評価し、最後のものを結果全体として与える)。