0

次のようなコードを作成しました。

int foo, bar1 = 4, bar2 = 7;

foo = bar1, bar2; // Look at this expression.

printf("%d", foo);

-Wallおよび-Wextraを使用して、GCC でコンパイルしました。出力は でした4

醜いことは別として、この式は未定義の動作ですか、それともfoo常にに設定されていbar1ますか?

4

3 に答える 3

1

これはコンマ演算子foo = (bar1++, f(bar2));であり、主に which incrementsのような副作用のある式で役立ち、bar1関数fを呼び出しbar2てその結果をに設定しますfoo

Cでは、コンマ演算子は代入よりも優先順位が低くなります。

一般e1,e2に (式のコンテキストで) 左のオペランドを評価し、e1その結果を破棄e2してから、右のオペランドを評価し、右のオペランドの値を (式全体の値としてe1,e2) 与えます。

Ocaml には;演算子があり、Scheme には がありbegin、Lisp にprognは同様の目的があります (副作用のために 2 つまたは複数の部分式を評価し、最後のものを結果全体として与える)。

于 2013-08-29T17:36:07.870 に答える