まず第一にスペースが重要です - コンパイラが曖昧さを解決するのに役立ちます。
式があるときはいつでも、コンパイラはそれを右から左に解析します。最初にすべてのポスト インクリメント演算子を検索し、次に前インクリメント演算子の優先順位が前者よりも低いため、それを検索します。したがって、プレインクリメント演算子によって行われた変更は式全体に適用され、ポストインクリメントの変更は次の式に適用されます。
説明
- ++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 修飾変数を指定すると、コンパイル エラーが発生します。