Java中的布尔表达式
Posted
技术标签:
【中文标题】Java中的布尔表达式【英文标题】:Boolean expressions in Java 【发布时间】:2010-10-04 08:11:36 【问题描述】:我对 Java 中 return 语句中布尔变量的含义(评估)有疑问。
我知道:
if (var) ...
等同于:
if (var==true) ...
在第二种情况下,我们明确地说 var==true,但我们不需要这样做,因为 Java 无论如何都会将 var 评估为 true。我希望我已经正确理解了这一点。
我的问题是:返回布尔变量时是否相同?什么时候有return语句?
例如,一个任务指定:方法looksBetter() 将仅在b
public boolean looksBetter()
if (b < a)
return true;
else
return false;
简单的答案是:
public boolean lookBetter()
return b < a;
所以,这里我们似乎再次有这个隐含的假设,即如果 b
【问题讨论】:
【参考方案1】:这不是“隐含的假设”,而是编译器正在做的事情。 b < a
只是一个表达式,就像它用于 if
语句一样。该表达式的计算结果为 boolean
,然后返回。
同样值得注意的是,您似乎将boolean
和Boolean
互换,好像它们是相同的,但实际上并非如此。 boolean
是 primitive 形式,而 Boolean
是 an Object 包装 boolean
。
【讨论】:
但是对于所有意图和目的,尤其是自动装箱,原语和对象包装器是一回事。 我同意这一点,但它们之间肯定存在差异,应该理解,尤其是对于刚接触该语言的人。 使用“本质上相同的东西”方法的唯一问题是使用 null。对象可以为空,原语不能。尝试自动取消装箱空值。异常的含义并不十分明显。 “原语和对象包装器是一回事” - 不。boolean
可以为真或假,Boolean
也可以为空。【参考方案2】:
是的,这适用于所有布尔值。您可以考虑 if(expression) 评估“表达式”以查看它是“真”还是“假”。当你这样做时
if(b < a == true)
它首先测试是否 b
if(true == true)
它现在测试是否为真 == 真(它显然是这样做的)。当您省略额外的“== true”时,Java 并没有做任何棘手的事情,它只需要执行更少的测试。你没有理由不能说:
if(((b < a == true) == true) == true)
但它会导致 Java 在每次看到等号时执行额外的测试。
【讨论】:
【参考方案3】:不要不必要地使您的代码复杂化。如果你觉得有必要说“a ((((((((...(a<b) == true) == true).... == true)”
"a 更多成为布尔值。
【讨论】:
【参考方案4】:Java 条件需要一个布尔值。如果你可以把它放到 if 语句中,它已经是一个布尔值,如果你想要的是一个布尔值,就不需要进一步摆弄了。
确实,像value == true
这样的构造可能很棘手。我不记得 Java 中的提升规则,但在 C++ 中,bool 可以提升为 int,false 变为 0,true 变为 1。因此,int a = 2; if (a)
和 int a = 2; if (a == true)
会做不同的事情。
【讨论】:
Java 没有提升规则。 'if (a)' 和 'if(a == true)' 在 Java 中会给你一个编译错误。【参考方案5】:如果您尝试将运算符视为方法,您的困惑可能会得到缓解。使用您的示例,您有
public boolean lookBetter()
return lessThan(b, a);
也许这样看会让它更容易理解?顺便说一句,当我在大学的“编程 101”课程中带领练习小组时,事实证明这是迄今为止最难教的东西,而且很多人都难以掌握所涉及的概念。它几乎类似于学习骑自行车或游泳,一旦你了解了它的工作原理,它在某种程度上就变得不言而喻了。
【讨论】:
【参考方案6】:就像 C++ 一样,每个语句都有一个返回值,即使是运算符左侧的东西。我见过的一些更疯狂的 C++ 在左侧有操作,它们的结果被分配给。
如果我执行以下操作,我发现效果会更好:
bool result = (b > a);
return result;
唯一的原因是更容易调试(在几乎任何 IDE 中)。我发现我总是用括号括起来,我不太清楚为什么。我认为它使可变电子在晚上睡觉时保持温暖。
【讨论】:
【参考方案7】:我想你是在问为什么你在概念上有问题。
我认为基本问题是当你直接返回一个布尔值时,你会丢失一些东西,而你确实是。这是您的情况下的方法名称。
你的 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;
您必须将“布尔”视为一个实际值,而不仅仅是某种中间状态。如果它让您感到不舒服,请随意将其设为变量(它真的不会花费任何成本,并且可能会让您现在更容易阅读)。
稍后您将回顾您的代码,并且会更适应以更短的方式查看代码。您的头脑通常需要时间来开辟一些新的道路,在此期间不要因为直言不讳而感到尴尬。
【讨论】:
【参考方案8】:您的方法会起作用,但可能有点不清楚究竟应该发生什么,特别是如果您只有名为 a 和 b 的变量。您想记录方法并拥有具有正确名称的变量。
另外,如果代码刚写完就让您感到困惑,请想一想那些将在 6 个月后出现但完全不知道发生了什么的人。适当的文档和 cmets 会有很大帮助。
【讨论】:
以上是关于Java中的布尔表达式的主要内容,如果未能解决你的问题,请参考以下文章