2016-08-16 116 views
0

在學習OCA/OCP for Java的過程中,我發現了這個令人驚訝的事情。如果條件在圓括號內的賦值情況下評估真或假,

下面是第一段代碼,其中if(測試條件)部分 令我驚訝。

public class BooleanIf { 
public static void main(String[] args) { 
    boolean b = false; 
    System.out.println(Boolean.valueOf(b = true)); 
    if (b = true) 
     System.out.println("true"); 
    else 
     System.out.println("false"); 
} 

現在這個出人意料的結果是「真實的」。

我知道必須有一個關係條件,如同if (a > b)if (a != b)一樣返回true或false。

我想知道它是如何返回true爲這種情況。它是否調用Boolean.valueOf()?

+2

如果你真的在爲OCPJP學習,你應該知道這一點!如果沒有,請先完成OCAJP! – NoRelect

+0

這個問題怎麼來得到10k +用戶的回答?爲reall ??,我以爲它只是像我這樣的低代表妓女,追逐這些..嗯 – Elltz

+0

@NoRelect對不起,我的意思是oca和ocp都。 –

回答

6

=是賦值運算符,==是比較運算符。但

x = y 

不是y值僅分配給x,它也回報該值。由於我們可以做的事情一樣x=(y=1)(我們甚至可以在這裏放下括號),將分配給1y,然後1會被從該表達式返回並分配給x

在你的情況在if (b = true)第一true將被分配到b那麼它將返回,所以你最終if(true)所以它總是從分支執行代碼爲布爾值。


這往往會造成印刷錯誤的,因爲在大多數情況下,我們希望==(等於運算符),而不是=(賦值運算符)。

爲了避免這種錯誤,我們可以編寫代碼就像

  • if (b){..} - 因爲b == true總是b我們跳過== true一部分。 if可以使用的b價值而不是評估b == true。當我們想用否定的,而不是==false我們可以使用Yoda conditionsif(true == b){..}if(!b){..}
  • - 如果錯誤地,我們將使用=代替==我們將得到編譯錯誤,這將告訴我們吧,因爲我們不能分配什麼true,我們只能賦值變量
2

這是不是一個很好的做法

Boolean.valueOf(b = true),,你應該避免做這樣的,現在有關問題>

if (b = true)是一樣的

b = true; 
if (b) 

因此,條件總是滿足

與此類似。

if (b = false) 

將永遠不會執行...

附加信息:

那種錯別字/錯誤是由一般初級開發者所做的......

一些在歷史上,當的發展,它來了一個解決方案...

所謂的JODA條件(稱爲像主JODA從星星戰爭......)

如此,JODA-條件將在這種情況下,安全的,因爲你可以試着這樣做:

if (true = b) { 
     // code here 
    } 

但因爲抱怨就不會編譯:

的左手邊的作業必須是一個變量,

爭議仍然是開放的關於有多好的想法是,代碼更像那樣的可讀性等......,

0

if期望布爾類型的表達式。

布爾變量的類型爲...布爾。

所以,當你把一個布爾變量後面的,如果可能會發生什麼?

1

首先讓我們通過查看if語句的結構:

if (<boolean-expression>) { 
    ... 
} 

<boolean-expression>可以計算結果爲boolean任何表情。最常見地,這是一個邏輯表達式,即具有比較運算符和/或一些邏輯運算符的表達式,如&&||,和!

但是,表達式可能是一個方法的調用返回boolean,例如:

if (list.isEmpty()) { 
    ... 
} 

接下來,讓我們來看看一個賦值表達式。這是一個副作用的表達。右側進行評估並分配到左側。賦值表達式的值是賦值後變量的值。

就你而言,作業爲b = true,所以表達式的值爲true。其插入第一部分解釋了爲什麼你,你看到的結果 - b = true

if (b = true) { 
    ... 
} 

是一個有效的布爾表達式返回true,所以代碼要求,並且可以正常運行。更常見的情況下使用的分配結果保存以供將來參考,像這樣:

if (b = list.isEmpty()) { 
    ... 
} 

這讓你到外面list.isEmpty()條件的結果,而無需再次調用方法。

說明:儘管在條件內部進行賦值是一種有效的做法,但情況並不常見,所以應該對其使用進行大量評論。

相關問題