2014-01-23 26 views
2

表達式如何在此方法內求值。 e.g System.out.println("Result"+2+3+4)產生Result234 但System.out.println("Result"+2+3*5)回報Result215string + int的表達式求值順序

我明白了由左到右,如果一個操作數是字符串,那麼結果將是字符串,表達式的結果。對於上面的第二個例子,這是有道理的。但是例如上面的結果不應該是Result27?

更多示例會有所幫助。

回答

7

字符串連接運算符(+)觸發的int值的字符串轉換的需要,因爲左邊的第一個參數是一個字符串。在評估拼接運算符之前,優先級的順序會導致兩個整數的乘法在第二個示例中首先出現。

我需要檢查字節碼,但我相信,編譯器使用StringBuilder這裏,所以真正的代碼看起來像:

System.out.println(new StringBuilder("Result").append(2).append(3).append(4)); 
System.out.println(new StringBuilder("Result").append(2).append(3 * 5)); 

編輯的完整性:

你的例子,因爲它們完全由文字(字符串和原語)組成,在編譯時處理,並簡單地轉換爲字符串文字。這是一個Compile Time Constant Expression。優先順序仍然適用,因此結果相同。

如果任何這些都一直是一個變量,例如:

int x = 5; 
System.out.println("Result"+2+x); 

然後StringBuilder在運行時用來連接與所述變量的值的文字部分。

(編輯看字節碼和JLS後是權威)

+0

+ 1..great解釋。 –

5

這是發生,因爲*+

因此,在這個更高的優先級:System.out.println("Result"+2+3*5)

  1. 3*5計算導致15然後
  2. 拼接完成。

所以你得到215

Operator precedence

+0

@KevinPanko感謝編輯 – SpringLearner

1
System.out.println("Result"+2+3+4) yields Result234 
Reason : "Result" + "2" +"3" +"4" // "+" is concatenation operator here 


but System.out.println("Result"+2+3*5) returns Result215 
Reason : "Result" +"2" +(3*5)/'*' priority is more than that of '+'. 
      "Result"+"2"+"15" 
      "Result215" 

    System.out.println(2+3+4); 
    O/P : 9 (2,3 and 4 are parsed as integers..) 
0

這是因爲println的參數以一個字符串開始,所以它開始串聯的參數作爲一個字符串的其餘部分。但由於'*'的優先級高於'+',因此它會在將其與其餘字符串進行比較之前對其進行評估。這就是爲什麼你會得到215

如果你曾試圖

System.out.println(2+3*5); 

那麼結果將是17。

+0

結果將是** 14 **不是** 17 ** – SpringLearner

+0

不,它不會。答案是17. http://en.wikipedia.org/wiki/Order_of_operations – CaptainRedmuff

+0

@CaptainRedmuff我編譯並運行在我的eclipse中,它顯示14.Pleas看到這個http://ideone.com/8ObYnd – SpringLearner

1

與正常的數學一樣,中綴符號的執行有一些排序。在學校,我學到了BIDMAS或BODMAS(取決於誰在教學),儘管你也可能知道PEDMAS。 Java遵循與數學相同的中綴符號執行順序(請參閱此refference)。

這意味着*符號在+符號之前被評估,因爲它具有更高的優先級(或者技術上更精確的編程,更高的優先級)。在使用中綴表示法時,java通常使用第一個元素的類型作爲輸出的類型,因此a + b將產生與a相同類型的結果。通過這種方式,這就是爲什麼你的字符串連接與你的第一個例子。如果你仔細留意我已經把括號

System.out.println((("Result"+2)+(3*5))) 

當java的評估,這將組中綴符號分成兩人一組,並使用同樣的規則,以便:

System.out.println("Result"+2+3*5) 

變在中,你可以很清楚地看到執行的順序。要麼首先完成"Result"2的連接,要麼是35的乘法 - 無論哪種方式,這都不會影響結果。之後,Result215連接。

例如,如果,你想強制執行的順序,然後括號統治所有其他人,所以你可以很容易地通過如下補充支架讓你的第一個例子輸出Result9

System.out.println("Result"+(2+3+4)) 

最安全的做法但是,總是使用括號,這樣評估的順序就不會有差異。

有關運算符優先完整的指南,你可以查看Java文檔上Operators