任何人都可以解釋下面代碼輸出的邏輯嗎?有條件的操作符行爲
if(true||false&&false){
System.out.println("right to left ");
}
if (false && true||true){
System.out.println("left to right");
}
任何人都可以解釋下面代碼輸出的邏輯嗎?有條件的操作符行爲
if(true||false&&false){
System.out.println("right to left ");
}
if (false && true||true){
System.out.println("left to right");
}
如果你看一看this Operator precedence table,你可以看到&&
比||
更高的優先級。
因此,兩人的表情都是這樣評價:
true || false && false
== == true || (false && false)
true
false && true || true
== == (false && true) || true
true
@ Keppil非常感謝很多人用非常簡單的方式解釋它。非常基本的事情還是讓我撓了一陣頭腦。 – user2388736
非常歡迎。 :) – Keppil
if(true||false&&false)
可以簡化爲真,因此它打印行。它可以簡化爲true,因爲您在左側有true
。由於右邊有一個or/||
,事情已經是真的,這意味着它可能會短路,而不會評估其餘的。您可以通過採用false&&false
來證明這一點,將其放入自己的方法中,然後在返回之前打印一行。你會看到它不打印。這是因爲(false && false)
甚至沒有評估。
false && true||true
可以簡化爲真,因此它打印行。 false && true
評估爲false,但由於存在或遺留下來,它會評估其他方面。事實證明這是事實。由於false||true
== true
,評估結果爲真。儘管這裏沒有短路。您可以通過將false && true
解壓到其自己的方法並在第一行打印某些東西來證明這一點。你會看到,它打印:
public static void main(String args[]) {
if(true|| doSomething()){
System.out.println("right to left ");
}
if (doSomethingElse() ||true){
System.out.println("left to right");
}
}
private static boolean doSomething() {
System.out.println("do something"); //this does NOT print
return false&&false;
}
private static boolean doSomethingElse() {
System.out.println("do something else"); //this DOES print
return false && true;
}
r從左到右或從右到左簡化它。 – user2388736
@ user2388736就像dlev說的那樣。但是在將其包含在括號中後,它將從左到右進行評估。 –
我希望我知道爲什麼我會在這件事上瘋狂起來和低估。有人給出了降價的理由。 –
的Java給出了不同的運算符優先級,以&&
和||
。這意味着你的表情可以寫成true || (false && false)
和(false && true) || true
。當你在布爾表達式中看到「或者真」時,它總是如此。這就是爲什麼兩個字符串都被打印。
如果你想讓你的表達清楚,你總是可以在x && y
零件的周圍放上括號。
首先,如果情況在編譯時被消除,只要結果是恆定的。
||(或) - 除了
& &(和) - 乘
這就是爲什麼& &比||的優先級高
因此,通過優先級的表達式是等於:
true + (false * false)
和(false * true) + true
&&具有比||更高的優先級,所以表達式括號如'(真||(假&&假))'和' (((false && true)|| true)'。你可以從那裏解決它。 – dlev
這是正確的http://bmanolov.free.fr/javaoperators.php不言而喻,在真正的程序中寫這些中的任何一個都是在尋求麻煩;括號總是很好 –