3

我对 Java 中 return 语句中布尔变量的含义(评估)有疑问。

我知道:

if (var) { ... }

是相同的:

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

在第二种情况下,我们明确地说 var==true,但我们不需要这样做,因为 Java 无论如何都会将 var 评估为 true。我希望我已经正确理解了这一点。

我的问题是:返回布尔变量时是否相同?当我们有一个 return 声明?

例如,一个任务指定:只有当 b < a 时,looksBetter() 方法才会返回 true。我的解决方案是:

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

简单的答案是:

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

所以,这里我们似乎再次有了这个隐含的假设,即如果 b < a == true,则方法的返回为 true。对不起......这似乎很微不足道,但我对此感到不舒服,我不知道为什么。谢谢你。

4

8 回答 8

14

这不是“隐含的假设”,而是编译器正在做的事情。这b < a只是一个表达式,就像它被用于一个if语句一样。该表达式的计算结果为 a boolean,然后返回。

同样值得注意的是,您似乎可以互换booleanBoolean好像它们是相同的,但实际上并非如此。boolean原始形式,Boolean而是包装 a的对象boolean

于 2009-01-29T20:26:46.097 回答
11

是的,这适用于所有布尔值。您可以考虑 if(expression) 评估“表达式”以查看它是“真”还是“假”。当你这样做

if(b < a == true)

它首先测试是否 b < a,如果是,它现在测试:

if(true == true)

它现在测试是否 true == true(它显然是这样做的)。当您省略额外的“== true”时,Java 并没有做任何棘手的事情,它只需要执行更少的测试。你没有理由不能说:

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

但它会导致 Java 在每次看到等号时执行额外的测试。

于 2009-01-29T20:27:01.730 回答
5

不要不必要地使您的代码复杂化。如果你觉得有必要说“a < b == true”,那么你可以按照它的逻辑混乱(结论+混乱)说“ ((((((((...(a<b) == true) == true).... == true)

"a < b" 是一个布尔表达式。如果您已经有一个布尔值,为什么要将它与另一个布尔值进行比较?您不会以这种方式使其更加布尔值。

于 2009-01-29T20:27:28.420 回答
1

Java 条件需要一个布尔值。如果您可以将其放入 if 语句中,则它已经是布尔值,如果您想要的是布尔值,则无需进一步摆弄。

事实上,像这样的结构value == true可能很棘手。我不记得 Java 中的提升规则,但在 C++ 中,bool 可以提升为 int,false 变为 0,true 变为 1。因此,int a = 2; if (a)andint a = 2; if (a == true)会做不同的事情。

于 2009-01-29T20:34:38.563 回答
1

如果您尝试将运算符视为方法,您的困惑可能会得到缓解。使用您的示例,您有 <“小于”运算符。对于我们的目的,< 操作符实际上可以被认为是一个“方法”(它只是看起来不像一个),它接受两个参数并返回一个布尔结果。如果“方法”被命名为 lessThan,那么您的示例将等同于:

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

也许这样看会让它更容易理解?顺便说一句,当我在大学的“编程 101”课程中带领练习小组时,事实证明这是迄今为止最难教的东西,而且很多人都难以掌握其中的概念。它几乎似乎类似于学习骑自行车或游泳,一旦你了解了它的工作原理,它在某种程度上就变得不言而喻了。

于 2010-10-25T08:57:34.333 回答
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;
}

您必须将“布尔”视为一个实际值,而不仅仅是某种中间状态。如果它让您感到不舒服,请随意将其设为变量(它真的不会花费任何成本,并且可能现在对您来说更具可读性)。

稍后您将回顾您的代码,并且更容易接受更短的查看方式。您的思想通常需要时间来开辟一些新的道路,同时不要因为明确而感到尴尬。

于 2009-01-29T21:00:06.297 回答
0

就像 C++ 一样,每个语句都有一个返回值,即使是运算符左侧的东西。我见过的一些更疯狂的 C++ 在左侧有操作,它们的结果被分配给。

如果我执行以下操作,我发现它会更好:

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

唯一的原因是更容易调试(在几乎任何 IDE 中)。我发现我总是用括号括起来,我不太清楚为什么。我认为它使可变电子在晚上睡觉时保持温暖。

于 2009-01-29T20:28:00.027 回答
-2

您的方法将起作用,但可能有点不清楚究竟应该发生什么,特别是如果您只有名为 a 和 b 的变量。您想要记录该方法并拥有具有正确名称的变量。

此外,如果代码刚写完就让您感到困惑,请想一想将在 6 个月后出现并且不知道发生了什么的人。适当的文档和评论将有很大帮助。

于 2009-01-29T20:29:37.793 回答