表達式如何在此方法內求值。 e.g System.out.println("Result"+2+3+4)
產生Result234 但System.out.println("Result"+2+3*5)
回報Result215string + int的表達式求值順序
我明白了由左到右,如果一個操作數是字符串,那麼結果將是字符串,表達式的結果。對於上面的第二個例子,這是有道理的。但是例如上面的結果不應該是Result27?
更多示例會有所幫助。
表達式如何在此方法內求值。 e.g System.out.println("Result"+2+3+4)
產生Result234 但System.out.println("Result"+2+3*5)
回報Result215string + int的表達式求值順序
我明白了由左到右,如果一個操作數是字符串,那麼結果將是字符串,表達式的結果。對於上面的第二個例子,這是有道理的。但是例如上面的結果不應該是Result27?
更多示例會有所幫助。
字符串連接運算符(+
)觸發的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後是權威)
這是發生,因爲*
比+
因此,在這個更高的優先級:System.out.println("Result"+2+3*5)
3*5
計算導致15
然後所以你得到215
@KevinPanko感謝編輯 – SpringLearner
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..)
這是因爲println的參數以一個字符串開始,所以它開始串聯的參數作爲一個字符串的其餘部分。但由於'*'的優先級高於'+',因此它會在將其與其餘字符串進行比較之前對其進行評估。這就是爲什麼你會得到215
如果你曾試圖
System.out.println(2+3*5);
那麼結果將是17。
結果將是** 14 **不是** 17 ** – SpringLearner
不,它不會。答案是17. http://en.wikipedia.org/wiki/Order_of_operations – CaptainRedmuff
@CaptainRedmuff我編譯並運行在我的eclipse中,它顯示14.Pleas看到這個http://ideone.com/8ObYnd – SpringLearner
與正常的數學一樣,中綴符號的執行有一些排序。在學校,我學到了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
的連接,要麼是3
和5
的乘法 - 無論哪種方式,這都不會影響結果。之後,Result2
與15
連接。
例如,如果,你想強制執行的順序,然後括號統治所有其他人,所以你可以很容易地通過如下補充支架讓你的第一個例子輸出Result9
:
System.out.println("Result"+(2+3+4))
最安全的做法但是,總是使用括號,這樣評估的順序就不會有差異。
有關運算符優先完整的指南,你可以查看Java文檔上Operators
+ 1..great解釋。 –