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 &lt; a 只是一个表达式,就像它用于 if 语句一样。该表达式的计算结果为 boolean,然后返回。

同样值得注意的是,您似乎将booleanBoolean 互换,好像它们是相同的,但实际上并非如此。 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中的布尔表达式的主要内容,如果未能解决你的问题,请参考以下文章

java中的?判断

JAVA 流程控制之选择语句

java if 语句默认

简析Java中while循环与do/while循环的区别

JAVA循环结构

Java 分支结构