2010-01-05 233 views
2

爲什麼我在爲相同的變量值使用算術運算符時得到兩個不同的值。我剛剛改變了我的第二個程序,這導致了不同的輸出。任何人都可以告訴我爲什麼?算術運算符混淆

int number=113; 
int rot=0; 
rot=number%10; 
rot*=100+number/10; 
System.out.println(rot);//333 



    int number=113; 
int rot=0; 
rot=number%10; 
rot=rot*100+number/10; 
System.out.println(rot);//311 
+0

有時,在數學操作數之間添加空格可以增加可讀性並使公式更清晰(對於您自己!)。例如。你可以寫'rot = rot * 100 + number/10'。 – 2010-01-05 10:18:22

+2

加上括號會使其更加清晰,儘管 – 2010-01-05 10:31:22

+0

括號混淆了像這些imho這樣簡單的表達式,簡單的算術規則對開發人員應該沒有問題 – rsp 2010-01-05 11:08:38

回答

8

在第一部分中,你計算

rot *= 100 + number/10 

這是

rot = rot * (100 + number/10) 

而在第二部分:

rot = rot*100 + number/10 

注意,乘法和除法除了之前去和減法。

2

問題是,* =有不同的(較低的)優先級比*和+

rot *= 100 + number/10; 

是equavalent到

腐=腐*(100 +數/ 10);

操作precdence可以發現here

1

好像問題是operator precedence

這意味着num * 10 + 13被視爲(num * 10) + 13,即()會根據語言的規則自動添加。

那麼,這種差異,在你的榜樣,是第一個具有以下含義:

rot*=100+number/10; 
// Is the same as this: 
rot = rot * (100 + (number/10)); 

而第二個含義如下:

rot=rot*100+number/10; 
// Is the same as this: 
rot = (rot * 100) + (number/10); 

由於括號是在不同的地方,這些可能會評估到不同的數字。

+2

-1 - 'rot * = 100 + number/10;'與'rot * 100 + number/10;'和'rot * 100 + number/10;'不同於'rot *(100 +(number/10));'。你有正確的答案,但是出於錯誤的原因。 – 2010-01-05 10:20:01

+0

@Stephen:謝謝,我已經改變了我認爲正確的答案(只是刪除了第二步,因爲它是錯的......不知道我想說什麼)。 – 2010-01-05 11:28:47

0

由於*的高優先級,所以在第二個代碼中。 rot * 100將會被計算出來並且將被加上(number/10),所以它的(300 + 11 = 311)。