特にプレフィックスと後置インクリメントとデクリメントCにおけるオペレータアソシエ
-
25-09-2019 - |
質問
はC演算連想はインクリメント、デクリメント、および割り当てのようです。
2. postfix ++ and --
3. prefix ++ and --
16. Direct assignment =
Cでの完全なリストがここに発見されたウィキペディア演算子する
私の質問があり、我々が持っているとき、
int a, b;
b = 1;
a = b++;
printf("%d", a); // a is equal to 1
b = 1;
a = ++b;
printf("%d", a); //a is equal to 2
後置インクリメント演算子を直接代入する前に起こるべき時になぜ++ Bで1に等しいですか?
そして、彼らは割り当て前に両方を接尾よりも前置インクリメント演算子は異なるされている場合、なぜ?
私はかなり確信して、それが動作連想性に来るとき、私は非常に重要な何かを理解していませんよ。
解決
次にa++
をインクリメントします後置オペレータa
は次のように元の値を返し、すなわち
{ temp=a; a=a+1; return temp; }
と新しい価値すなわちを返しますプレフィックス++a
ます。
{ a=a+1; return a; }
これはの優先のオペレータとは無関係である。
(と結合するa-b-c
が(a-b)-c
またはa-(b-c)
に等しいかどうかを決定します。)
他のヒント
演算子の優先順位と結合は、の前にを何が起こるかを教えてくれていないと何が起こるかの後にの。演算子の優先順位/結合性は、それとは何の関係もありません。以下のようなC言語の時間的関係における「前」またはいわゆるによって規定されている「後」のシーケンスポイントとのみのシーケンスポイント(とそれは全く別の話だ)によります。
演算子の優先順位/結合規則は、単純にオペランドがどの事業者に属します伝えます。例えば、発現a = b++
正式(a = b)++
ようa = (b++)
として解釈することができます。演算子の優先順位は、/結合規則は、この場合は、単純に(すなわち++
がb
の結果にa = b
に適用されていない)、後者の解釈が正しいと前者が間違っていることを示していますです。
これは、もう一度、そのb
が最初にインクリメントされなければならないという意味ではありません。演算子の優先順位/結合規則は、再び、「最初に」何が起こるかで行うことに注目していると何が起こるか「次」。これは単にb++
式の結果がa
に割り当てられていることを示しています。定義により、b++
(後置インクリメント)の結果は、b
のオリジナルの値です。 a
が長いb
がb
のの元の値が割り当てられますようとして変数a
がインクリメントれます場合は1であるb
のの元の値は、完全に無関係であるでしょう理由はここにあります。コンパイラは、いつでも任意の順序と増分b
でこの式を評価することが許可されている:何でも行く、長いa
は何とかどのように「何とか」作品の元のb
の値(と誰もが本当に心配しにつれてとして内部的に)。
例えば、コンパイラは、基本演算の次のシーケンスとしてa = b++
を評価することができる
(1) a := b
(2) b := b + 1
または
次のようにそれを評価することができます(1) b := b + 1
(2) a = b - 1
第二の場合にb
が最初にインクリメントされながら、最初のケースでb
実際、最後にインクリメントされることに注意してください。 a
の元の値、それが得るべきものである - しかし、どちらの場合もb
は同じ正しい値を取得します。
しかし、私は二つの例上記だけで、例示の目的のためにここにいることを改めて表明しなければなりません。実際には、a = ++b
とa = b++
のような表現は、これらの式では、ビューのすべてのあなたのポイントから起こることをその手段、内部にはシーケンスポイントを持っていません。の同時の。何の「前」、「後」、「第一」、「次へ」または「最後には」ありません。このような表現は、彼らが有意義小さい一連のステップに分解することができないという意味で「アトミック」です。
としてAndreyTが既に指摘し、優先順位と結合は、評価の順序についてお教えていません。彼らは唯一のグループ化をご紹介します。例えば、優先順位はa*b+c
が(a*b)+c
代わりにa*(b+c)
としてグループ化されていることを使用することを伝えるものです。コンパイラは、それらの式のいずれかとのフィット感を見て、任意の順序でa
、b
とc
を評価することは自由です。結合性は、あなたが同じ優先順位の演算子を持っているとき、ほとんどの場合、同じ事業者をグループ化について説明します。例えば、それは、ないa-b-c
は(特に明記し、減算は左結合である)(a-b)-c
がa-(b-c)
と同等であることを示していますものです。
は、評価の順序は、シーケンスポイントによって定義されます。 (とりわけ)完全な表現の末端の配列ポイントがあります。シーケンスの時点で、すべての以前の評価が行われているしなければならない、とその後の評価はいずれもまだ行われていないことができます。
あなたの具体的な例を見てみると、a=b++;
で、その結果は、ほとんどのポストインクリメント自体の定義からです。ポストインクリメントは、変数の前の値が得られ、そしていつか次のシーケンスポイントの前に、その変数の値がインクリメントされます。プリインクリメントはインクリメントと、変数の値が適用生じます。どちらの場合では、しかしながら、平均変数代入の特定の順序に対してインクリメントされなければならないことはありません。
temp = b+1;
a = temp;
b = b + 1;
同様に、ポストインクリメントのバージョンでは、変数の代入の前または後にインクリメントすることができます:
a = b;
b = b + 1;
または
temp = b;
b = b + 1;
a = temp;
いずれかの方法で、それがインクリメントれる前しかし、a
に割り当てられた値がb
の値である必要があります。