0

私は C++ で演算子の結合性を学ぼうとしており、コード セグメントに出くわしました:

int a = 10;
int C = a++ + ++a + ++a +a;

++aまた、右から左への結合と左から右への結合についても調べましたa++。また+、左から右への結合です。しかし、この知識をこの問題に適用する方法がわかりません。

このステートメントがコンパイラによってどのように解析されるのか混乱していますか?

スペースを入れてもあまり問題にならないので、なぜスペースを削除するのが次のようになるのか、私も困惑しています:

int C = a+++++a+++a+a;  //error: lvalue required as increment operand

エラーを生成しますか?この概念を理解するのを手伝ってください。

ありがとう!

4

2 に答える 2

2

まず第一にスペースが重要です - コンパイラが曖昧さを解決するのに役立ちます。

式があるときはいつでも、コンパイラはそれを右から左に解析します。最初にすべてのポスト インクリメント演算子を検索し、次に前インクリメント演算子の優先順位が前者よりも低いため、それを検索します。したがって、プレインクリメント演算子によって行われた変更は式全体に適用され、ポストインクリメントの変更は次の式に適用されます。

説明

  • ++a は、最初に a の値をインクリメントしてから、a を参照する左辺値を返します。したがって、a を使用すると、インクリメントされた値になります。

あなたの場合、合計 2 つの ++a があるため、a の値は 12 にインクリメントされ、a に割り当てられます。したがって、式のすべての a は値 12 を保持し、c=48 の値を与えます。

  • a++ は、最初に値が a である右辺値 (古い値) を返し、次に、次の完全な式の前の未指定の時間に a をインクリメントします。

あなたの場合、式の後に a の値を使用すると、前の式では a++ が 1 つしかなかったため、13 になります。

たとえば。

int a = 10;
int C = a++ + ++a + ++a +a; // Here a=12 and the post increment effect will be applied in the next expression
int B = a + a; // Here a=13 the effect of previous post increment.

エラーについて

式にスペースがない場合、コンパイラは式を解析するときに混乱し、割り当てを行うための値がありません。

PS: lvalue は、代入の対象となる値です。C/C++ では、プレインクリメント (デクリメント) およびポストインクリメント (デクリメント) 演算子は、オペランドとして L 値式を必要とします。R 値または const 修飾変数を指定すると、コンパイル エラーが発生します。

于 2016-03-23T08:09:48.827 に答える
2

それがUBになるという事実を脇に置いてください(同じ変数のこれらの複数のインクリメントの間にシーケンスポイントがないため)

a+++++a+++a+a

として解析されます(パーサーは貪欲であるため)

((a++)++) + (a++) + a + a

が組み込み型の場合(a++)++は不正です。aint

于 2016-03-23T09:41:59.407 に答える