5

SO を参考にしてしばらく使ったことがありますが、これまでに質問したことはありません。私は現在、大学の C++ クラスにいて、Bjarne Stroutstrup によるProgramming: Principles and Practiceを自分の利益のために読んでいます。

現在、クラスで演算子について説明していますが、ステートメントでコンマ演算子がどのように機能するかについて頭を悩ませているようには見えません。1 つの例は、C プログラムを作成し、GDB を使用して結果を取得したとしても、クラスのオンライン部分のサンプル問題です。質問は:

次の式の前に x==16 と仮定すると、次の式の値はいくらになりますか (必ずしも x の値とは限りません)。

x++、++x、x+=x

どうやって正解を導き出すかということほど、正解には興味がない。this one hereなど、同様の質問に対するいくつかの回答を読みましたが、実際に代入演算子がない場合にこれがどのように適用されるかを見逃しているようです。と言っているのと同じでしょうか。

int y = (x++, ++x, x+=x);

また

int y = x++, ++x, x+=x;

それともどちらでもない?特に割り当てのないステートメントに関連して、カンマ演算子がどのように機能するかを誰か説明してもらえますか?

4

2 に答える 2

8

コンマ演算子は簡単ですが、簡単すぎて難しいです。すべての演算子の中で優先度が最も低いです。その優先度は代入演算子よりもさらに低くなります。関数への引数はコンマ演算子で区切られていないことに注意してください。

コンマ演算子は左側のオペランドを評価し、シーケンス ポイントを生成して結果を破棄し、右側のオペランドを評価します。

文脈では:

x++, ++x, x += x;

次と同等です。

x++;
++x;
x += x;

ただし、全体の値は の結果ですx += x;

x が 16 から始まるとすると、x は 17 に増加し、次に 18 に増加し、2 倍して 36 になります。したがって、全体の値は 36 です。

シーケンス ポイントがあるため、シーケンス ポイント間で同じ変数を 2 回以上インクリメントしないというルールに違反しないことに注意してください。

コンマ演算子を使用する唯一の理由は、個別のステートメントを使用できないが、コンマ演算子を使用できるコンテキストがあるためです。例えば:

for (i = 0, j = n; i < j; ++i, --j)

これらのコンマの代わりにセミコロンを使用することはできません。


質問には、2 つのサンプルがあります。

int y = (x++, ++x, x+=x);

int y = x++, ++x, x+=x;

1 つ目は正当で (不必要にゆがめられていますが)、36 に初期化yされます (そして 36 に設定xされます)。

2 つ目は正当なものではなく、コンパイルできません。コンマはコンマ演算子ではなく、個別の宣言子を区切る必要がありますが、++xandx += xは宣言子ではありません。ただし、次のように変更した場合:

y = x++, ++x, x+=x;

それなら合法でしょう。最初の項は次のとおりです。

y = x++

これは 16 を 17 に割り当てy、インクリメントしますx。第 2 項xは 18 にインクリメントします。x第 3 項は36 に変わります。

于 2015-02-09T08:07:58.530 に答える
4

コンマ演算子は、最初のオペランドを評価、それを破棄してから、2 番目のオペランドに評価し、評価の間にシーケンス ポイントを挿入します。

あなたの場合、この一連の式が評価されていることを意味します

x++   // evaluates to 16, increments x to 17
++x   // increments x to 18, evaluates to 18
x+=x  // increments x by x, i.e. by 18, evaluates to 36.

そして、完全な式は 3 番目のサブ式に評価されます。最初の式は 16 に評価されますxが、17 に増加します。2 番目の式はx18 に増加し、その数値に評価されます。x3 番目の値は 18ずつ増加し、 に評価されxます。つまり、36 に評価されます。

于 2015-02-09T08:08:03.233 に答える