2009-01-29 35 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”课程的领导者时,这是迄今为止最困难的一件事,而许多人无法理解所涉及的概念。这几乎就像学骑自行车或游泳一样,一旦你了解它的运作方式,它就会以某种方式变得不言而喻。