2017-02-11 85 views
2

我有一個家庭作業問題,我知道答案,但不明白爲什麼它是答案,只是希望找到能夠向我解釋的人。移位算術解釋(C)

#include <stdio.h> 

int main(void){ 
    int a = 0, b = 1, c; 
    c = a << b + b << a; 

    printf("d%\n",c); 
    return 0; 
} 

所以答案就出來了,所以C ='0'。我認爲'一個< < b'將等於0,'b < < a'會出來1,所以'c = 0 + 1'。爲什麼這是錯的?

然而,當我嘗試:

c = b << a + a << b 

C等於 '2'。這對我來說更沒意義。我會很感激,如果有人能向我解釋爲什麼它會像這樣工作,或者指向我一些參考,以澄清這種行爲給我。

回答

3

語言的語法(或 「運算符優先級」,如果你願意)說,

c = a << b + b << a; 

實際上是

c = ((a << (b + b)) << a); 

圍繞a,沒有別的值。這表達的變化。由於a的值爲0,因此結果不能爲0

同組告訴你,

c = b << a + a << b; 

c = ((b << (a + a)) << b); 

這是

c = ((1 << 0) << 1); 

而這正是該2是從哪裏來的。

+0

這很有道理,謝謝! – M4v

1

操作順序。操作者<<具有的優先級低於操作者+,使得:

  • 0 << 1 + 1 << 00 << (1 + 1) << 0,這是0 << 2 << 0這當然0的。

  • 1 << 0 + 1 << 01 << (0 + 1) << 0,這是1 << 1 << 0當然這是2

有疑問時總是使用括號,即使沒有疑問。

+0

我在這個問題中沒有給出括號,顯然我不知道我的操作順序以及我以爲我做的。謝謝! – M4v