2014-06-28 116 views
2

我正在爲OCA Java SE7 Associate考試進行學習。我的一個考試的實踐問題有下面的代碼片段:更改if語句內的布爾值?

boolean flag = true; 
if (flag = false) { 
    System.out.println("1"); 
} 
else if (flag) { 
    System.out.println("2"); 
} 
else if (!flag) { 
    System.out.println("3"); 
} 
else 
    System.out.println("4"); 

通知的if (flag = false)條件。這個問題問這個片段的輸出是什麼。所有的數字都是作爲答案選項提供的,然後有一個選擇說「編譯器錯誤」,這是我選擇的。我錯了。輸出將3.我在Eclipse測試,它也帶回來3

然後,我

int x = 3; 
int y = 1; 
if (x = y) { 
    // whatever 
} 

測試,當然,得到了一個錯誤。

爲什麼可以flagtrue改爲falseif-statement內,但是x的值不能改變在類似的情況?是否因爲flag是布爾類型,x是int?我谷歌搜索,但無法找到任何東西。

回答

6

因爲x = y的賦值不等於boolean評估。

if正在等待操作的結果給出truefalse返回。

喜歡的東西if ((x = y) == y)將工作(評估將返回true

+0

此外,這是一個很好的做法?除了在學習這門考試之外,我從未見過它。 – mishmomo

+2

@NojoRu不,這是非常糟糕的做法,人們閱讀(可能打字)它會認爲它是'=='。實際上,許多靜態分析器(如FindBugs)會將其標記爲錯誤。 – dkatzel

+0

我希望你會說這是一個不好的習慣。有點讓我想知道爲什麼它在考試中;僅僅因爲它可以做並不意味着它應該是。 – mishmomo

0

flag = false是一個賦值,因此它被執行。在對第一個if進行賦值之後,它的計算結果爲false,因爲它剛設置爲false。對於平等來說,它應該是flag == false,但由於它是一個賦值,所以最上面的if被評估爲false,並且由於它變成了false,當你到達!flag時,因爲flag不再爲真,並且它會打印3.

您在if(x = y)時出錯,因爲在賦值之後,該值無法評估爲布爾結果,而if(flag = false)可能在賦值後評估爲布爾值。

關於高級語言需要記住的一件大事是,它需要多個低級語句才能執行甚至簡單的邏輯,如果在賦值情況下執行最少2次操作,首先是任務,然後是平等。

0

if (flag = false)flag變量設置爲false,然後檢查if(flag)

您在暗示您在做if(x = 1)可能會將x設置爲1,但if(x)無效。

+0

不在Java中,iirc。 –

0

這將打印3因爲布爾變量分配false(並檢查真),然後檢查假,終於爲!false這是true