2013-05-16 28 views
2

任何人都可以解釋下面代碼輸出的邏輯嗎?有條件的操作符行爲

if(true||false&&false){ 
     System.out.println("right to left "); 
    } 
    if (false && true||true){ 
     System.out.println("left to right"); 
    } 
+7

&&具有比||更高的優先級,所以表達式括號如'(真||(假&&假))'和' (((false && true)|| true)'。你可以從那裏解決它。 – dlev

+0

這是正確的http://bmanolov.free.fr/javaoperators.php不言而喻,在真正的程序中寫這些中的任何一個都是在尋求麻煩;括號總是很好 –

回答

5

如果你看一看this Operator precedence table,你可以看到&&||更高的優先級。

因此,兩人的表情都是這樣評價:

true || false && false == == true || (false && false)true

false && true || true == == (false && true) || truetrue

+0

@ Keppil非常感謝很多人用非常簡單的方式解釋它。非常基本的事情還是讓我撓了一陣頭腦。 – user2388736

+0

非常歡迎。 :) – Keppil

1

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; 
} 
+0

r從左到右或從右到左簡化它。 – user2388736

+0

@ user2388736就像dlev說的那樣。但是在將其包含在括號中後,它將從左到右進行評估。 –

+0

我希望我知道爲什麼我會在這件事上瘋狂起來和低估。有人給出了降價的理由。 –

1

的Java給出了不同的運算符優先級,以&&|| 。這意味着你的表情可以寫成true || (false && false)(false && true) || true。當你在布爾表達式中看到「或者真」時,它總是如此。這就是爲什麼兩個字符串都被打印。

如果你想讓你的表達清楚,你總是可以在x && y零件的周圍放上括號。

0

首先,如果情況在編譯時被消除,只要結果是恆定的。

||(或) - 除了

& &(和) - 乘

這就是爲什麼& &比||的優先級高

因此,通過優先級的表達式是等於:

true + (false * false)(false * true) + true