2009-01-29 125 views
3

我對Java中返回語句中布爾變量的含義(評估)有疑問。Java中的布爾表達式

我知道:

if (var) { ... } 

是一樣的:

if (var==true) { ... } 

在我們明確地說,VAR第二種情況==真,但我們並不需要這樣做,因爲無論如何,Java將var評估爲true。我希望我能理解這個權利。

我的問題是:返回布爾變量時是否一樣?當我們有回報聲明?

例如,任務指定:僅當b < a時,方法looksBetter()纔會返回true。我的解決辦法是:

public boolean looksBetter() { 
    if (b < a) { 
     return true; 
    } else { 
     return false; 
    } 
} 

簡單的答案是:

public boolean lookBetter() { 
     return b < a; 
} 

所以,看來在這裏我們再次這隱含的假設是,在情況b <一個== true,則該方法的返回是真的。 我很抱歉...這看起來很平凡,但我不知道爲什麼。謝謝。

回答

13

這不是一個「隱含的假設」,它是編譯器正在做的事情。 b < a只是一個表達式,就像它用於if語句一樣。表達式評估爲boolean,然後返回。

同樣值得注意的是,你似乎在交換booleanBoolean,就好像它們一樣,但實際上並不是。 booleanprimitive表格,而Booleanan Object,其包裝boolean

+0

但是對於所有意圖和目的,特別是對於自動裝箱,原語和對象包裝都是同樣的事情。 – cdeszaq 2009-01-29 20:31:21

+0

我同意一個觀點,但他們之間肯定有區別,應該被理解,特別是對於新語言的人。 – 2009-01-29 20:42:41

11

是的,所有布爾值都是如此。你可以考慮if(表達式)是否評估'表達式'來判斷它是'真'還是'假'。當你做

if(b < a == true) 

它第一次測試,看看。如果B <一個,如果是這樣,現在的測試:

if(true == true) 

現在測試是否真==真(這顯然是)。當你省去額外的'== true'時,Java並沒有做任何棘手的事情,它只需要執行一次更少的測試。沒有理由不能說:

if(((b < a == true) == true) == true) 

但是它會導致Java在每次看到等號時執行額外的測試。

5

不要不必要地使代碼複雜化。如果你覺得有必要說:「一個< b == true」,那麼你可以遵循其邏輯conflusion(結論+混亂),並說「((((((((...(a<b) == true) == true).... == true)

「一個< B」是一個布爾表達式。如果你已經有一個布爾值,爲什麼把它與另一個布爾值進行比較?你不是這樣做更多布爾。

0

就像C++一樣,每條語句都有一個返回值,即使是操作符左側的東西。我見過的一些瘋狂的C++在左邊進行了操作,結果分配給了它們。

我覺得它的工作原理,如果我做了以下更好:

bool result = (b > a); 
return result; 

原因只在於是有點更容易調試(在幾乎任何IDE)。我發現我總是用括號包起來,我不太清楚爲什麼。我認爲它可以在夜間睡覺時保持可變電子的溫暖。

-2

你的方法可以工作,但可能有點不清楚究竟應該發生什麼,尤其是如果你只有名爲a和b的變量。您想要記錄該方法並使用適當名稱的變量。另外,如果代碼在寫完之後讓你感到困惑,想想會有人在6個月內到來,並且不知道發生了什麼。正確的文檔和評論將有極大的幫助。

1

Java條件需要一個布爾值。如果你可以把它放到一個if語句中,它已經是一個布爾值了,如果你想要的是一個布爾值,就不需要進一步的調整。

事實上,像value == true這樣的結構可能會非常棘手。我不會忘記Java中的促銷規則,但是在C++中,可以將bool升級爲int,其中false爲0,true爲1.因此,int a = 2; if (a)int a = 2; if (a == true)將執行不同的操作。

0

我想你是在問爲什麼你有一個概念上的問題。

我認爲基本問題是,當你直接返回一個布爾值時,你錯過了一些東西,而你是。這是你的情況下的方法名稱。

你的LooksBetter沒有任何意義。你真正的想法是這樣的:

boolean isEarlier(Time a, Time b) { 
    if(a < b) //for simplicity let's ignore that this won't work. 
     return true; 
    else 
     return false; 
} 

現在,你可以減少到:

boolean isEarlier=a < b; 

嗯,好了,現在我們可以看到,A比B更早,這就是中間值isEarlier的意思是。

所以一旦你有種內在的是中間值,這使得更多的意義:

boolean isEarlier(Time a, Time b) { 
    return a < b; 
} 

你必須考慮的是「布爾」作爲一個真正的價值,而不僅僅是一些中間狀態。如果它讓你感到不舒服,可以隨意將它變成一個變量(它實際上不需要花費任何東西,並且可以使它更容易理解)。

稍後,您將回顧一下您的代碼,並以更短的觀察方式更舒適。大部分時間你的頭腦需要一些新的路徑,不要在此期間顯得尷尬。

0

這不是一個「隱含假設」或其他一種魔法。
只是兩個不同的表達式產生相同的結果。
它類似

int i = 123; 
return i; 

int i = 123; 
return i + 0; 

「I」 和 「i + 0」 的兩個表達導致相同的值。 (編譯器應該足夠聰明,以便將最後一個簡化爲與第一個相同)

1

如果嘗試將運算符作爲方法進行考慮,可能會降低您的困惑。使用你的例子,你有<「小於」運營商。對於我們的目的,<運算符可以真正被認爲是一個「方法」(它看起來不像一個),它接受兩個參數並返回一個布爾結果。如果「辦法」被命名爲每種不超過,你的例子是相同的:

public boolean lookBetter() {  
    return lessThan(b, a);  
} 

也許看到它這樣使得它一點點更容易理解?順便說一下,當我在統一領導「編程101」課程的領導者時,這是迄今爲止最困難的一件事,而許多人無法理解所涉及的概念。這幾乎就像學騎自行車或游泳一樣,一旦你瞭解它的運作方式,它就會以某種方式變得不言而喻。