我对Java中的return语句中布尔变量的含义(评估)有疑问。
我知道:
if (var) { ... }
与:
相同if (var==true) { ... }
在第二种情况下,我们明确地说var == true,但我们不需要这样做,因为Java无论如何都会将var评估为真。我希望我理解这一点。
我的问题是:返回布尔变量时是否相同?当我们有退货声明?
例如,任务指定:方法LooksBetter()仅在b<一个。我的解决方案是:
public boolean looksBetter() {
if (b < a) {
return true;
} else {
return false;
}
}
简单的答案是:
public boolean lookBetter() {
return b < a;
}
所以,似乎在这里我们再次有这个隐含的假设,即如果b&lt; a == true,方法的返回为true。 对不起......这看起来很微不足道,但我对此感到不舒服,我不知道为什么。谢谢。
答案 0 :(得分:13)
这不是“隐含的假设”,而是编译器正在做的事情。 b < a
只是一个表达式,就像它用于if
语句一样。表达式的计算结果为boolean
,然后返回。
同样值得注意的是,您似乎将boolean
和Boolean
交换为一样,但它们实际上并非如此。 boolean
表单是Boolean
,而boolean
primitive表示{{1}}。
答案 1 :(得分:11)
是的,对所有布尔人来说都是如此。您可以考虑if(表达式)评估'表达式'以查看它是'true'还是'false'。当你这样做
if(b < a == true)
它首先测试是否b < a如果是,它现在测试:
if(true == true)
现在测试是否为true == true(显然它确实如此)。当你省去额外的'== true'时,Java没有做任何棘手的事情,它只需要少执行一次测试。你没理由不说:
if(((b < a == true) == true) == true)
但是每次看到等号时,它都会导致Java执行额外的测试。
答案 2 :(得分:5)
不要让代码复杂化。如果您觉得需要说“a&lt; b == true”,那么您可以遵循它的逻辑错误(结论+混淆)并说出“((((((((...(a<b) == true) == true).... == true)
”
“a&lt; b”是布尔表达式。如果你已经有一个布尔值,为什么要将它与另一个布尔值进行比较?你没有这样做 more 布尔。
答案 3 :(得分:1)
Java条件需要布尔值。如果你可以将它放入if语句中,它已经是一个布尔值,如果你想要的是一个布尔值,则不需要进一步摆弄。
确实,像value == true
这样的结构可能很棘手。我没有记得Java中的升级规则,但是在C ++中,bool可以被提升为int,false变为0,true变为1.因此,int a = 2; if (a)
和int a = 2; if (a == true)
会做不同的事情
答案 4 :(得分:1)
如果您尝试将运算符视为方法,则可能会减轻您的困惑。使用你的例子,你有&lt; “不到”运营商。出于我们的目的,&lt;运算符实际上可以被认为是一个“方法”(它看起来不像一个),它接受两个参数并返回一个布尔结果。如果“方法”被命名为lessThan,那么您的示例将等同于:
public boolean lookBetter() {
return lessThan(b, a);
}
也许这样看起来有点容易理解?顺便提一下,当我在Uni的“Programming 101”课程中领导练习小组时,这被证明是迄今为止最难教授的,而且很多人都难以掌握所涉及的概念。它似乎类似于学习骑自行车或游泳,一旦你了解它如何工作,它在某种程度上变得不言而喻。
答案 5 :(得分:0)
就像C ++一样,每个语句都有一个返回值,甚至是操作符左侧的东西。我看到的一些疯狂的C ++在左侧有操作,其结果被分配给。
我发现如果我执行以下操作会更好:
bool result = (b > a);
return result;
唯一的原因是调试更容易(几乎任何IDE)。我发现我总是用括号括起来,我不太清楚为什么。我认为它可以使可变电子在晚上睡觉时保持温暖。
答案 6 :(得分: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;
}
你必须将“布尔”视为真正的价值,而不仅仅是某种中间状态。如果它让你感到不舒服,可以随意使它变成一个变量(它实际上没有任何成本,并且可能使你现在更具可读性。)
稍后您将回顾您的代码,并以更短的方式查看它。你的大脑需要时间来培养一些新的道路,同时不要尴尬明白。
答案 7 :(得分:0)
这不是“隐含的假设”或其他一些魔法
只是两个不同的表达产生相同的结果。
这就像
int i = 123;
return i;
或
int i = 123;
return i + 0;
“i”和“i + 0”是两个表达式,它们产生相同的值。 (编译器应该足够聪明,以便将最后一个简化为与第一个相同)
答案 8 :(得分:-2)
您的方法可行,但可能有点不清楚究竟应该发生什么,特别是如果您只有名为a和b的变量。您希望记录方法并使用具有适当名称的变量。
此外,如果代码在您编写代码后让您感到困惑,请考虑一下将在6个月后进入的人,并且不会知道发生了什么。正确的文档和评论将有很大帮助。