考慮下面的代碼:爲什麼10 >> 2 + 5 >> 2評估爲零?
int a=10, b=5;
int c=a>>2+b>>2;
System.out.println(c);
運行時,(令人驚訝的)輸出爲0
爲什麼會這樣呢?
考慮下面的代碼:爲什麼10 >> 2 + 5 >> 2評估爲零?
int a=10, b=5;
int c=a>>2+b>>2;
System.out.println(c);
運行時,(令人驚訝的)輸出爲0
爲什麼會這樣呢?
以Java的operator precedence(尤其是+
比>>
更高的優先級),並結合規則考慮,表達的是相當於
(a >> (2 + b)) >> 2
或
(10 >> (2 + 5)) >> 2
這是零。
如果您需要在轉移前除了要發生,parenthesise他們:
(a >> 2) + (b >> 2)
因爲它就像寫(Operator Precedence):
(a >> (2 + 5)) >> 2
這就像寫:
(10 >> 7) >> 2
哪個是0,爲什麼?
想想10的二進制表示,假設8位:
00001010
現在,向右移位7它,你會右移2得到0。Shift鍵,你仍然會得到0 。
運算符優先級!
如果你的代碼可以用不同的方式解釋,那麼它幾乎肯定會有一天。總是使用括號 - 永遠不要依賴於運算符優先級。
int a = 10, b = 5;
int c = a >> 2 + b >> 2;
System.out.println(c);
int d = (a >> 2) + (b >> 2);
System.out.println(d);
int e = ((a >> 2) + b) >> 2;
System.out.println(e);
int f = a >> (2 + b) >> 2;
System.out.println(f);
打印
0
3
1
0
感謝您的快速重播......它的罰款。 –