2017-05-19 14 views
0
#include <stdio.h> 

int main(void) { 

    int i; 
    i = 10; 
    i*= 10+2; 
    printf("%d",i); 
    return 0; 
} 

なぜ、次のコード120の出力は102ではないのですか?C演算子の実行順序

+1

http://en.cppreference.com/w/c/language/operator_precedenceで注文するため

C参照は 'iは= iは(10 + 2)' – d9ngle

+1

* '= 10 + 2 'であり、*そして、この問題は、I = 10 + 2 *'ことは非常に理由です。 'は**悪いコード**です:それはすぐにそして明示的にそれが何をするのかを明らかにしていません。 (そして、コードがOKだと思って、C演算子の優先順位の微妙な知識があなたのコードをより良くするものであることを証明しているなら、コードの残りの部分で、その細目から目立ちますか?) –

+0

ここでは、私が120または100で終わるという2つのオプションがあります。102は理にかなっていません。 'i * =(10 + 2)'または '(i * = 10)+ 2'のいずれかです。 – Art

答えて

4

優先順位が「+」よりも高いため、10 + 2はi * =のために発生します。

0

この

i*= 10 + 2; 

は I * =追加し、残りは優先順位は左から右です

i= i * (10 + 2); 

のためにシンタックスシュガーであり、このラインではmult./division

+0

これは何が起こっているのかを理解する最も明白な方法のように思えるので、なぜこれが下落したのか分かりません。おそらく2人が混乱していました。複合代入演算子は自分自身の優先順位を持ち、実際にはあなたが記述した方法で分解されていないという事実を見ているでしょうか? –

+0

私は投票しませんでしたが、これは質問されたように質問に答えません。説明は、 '* ='は '+'より優先度が低く、 '* ='は構文的な砂糖ではないということです。 – Peter

+1

この微妙なディテールのため投票が厳しいが、これは構文上の砂糖ではない。 6.5.16を参照してください。E1 op = E2形式の複合割り当ては、左辺E1が1回だけ評価されることを除いて、単純割当 式E1 = E1 op(E2)と等価です。それは問題ですか?はい、オペランドを評価すると副作用が生じます。たとえば、 'i'がvolatileとして宣言されているとします。 'i * = a + b;'は 'i = i *(a + b);と同じものではありません。 – Lundin

0

後をsubst 10 + 2; この場合、iは12を乗算する。 i = 10 * 12; それで120を返す答えに

この問題を解決するには これを試してください。

i*= 10; 
i+=2; 
+0

この回答に追加する演算子の優先順位を説明して、なぜ起こるのかを教えてください。 –

0

あなたのコードは次のように動作します。

i= i*(10+2) 

102 DOのようなあなたのwanna答えた場合ので、それは120

のような答えを与えます。

i=i*10+2