2016-08-16 36 views
0

在学习OCA/OCP for Java的过程中,我发现了这个令人惊讶的事情。如果条件在圆括号内的赋值情况下评估真或假,

下面是第一段代码,其中if(测试条件)部分 令我惊讶。

public class BooleanIf { 
public static void main(String[] args) { 
    boolean b = false; 
    System.out.println(Boolean.valueOf(b = true)); 
    if (b = true) 
     System.out.println("true"); 
    else 
     System.out.println("false"); 
} 

现在这个出人意料的结果是“真实的”。

我知道必须有一个关系条件,如同if (a > b)if (a != b)一样返回true或false。

我想知道它是如何返回true为这种情况。它是否调用Boolean.valueOf()?

+2

如果你真的在为OCPJP学习,你应该知道这一点!如果没有,请先完成OCAJP! – NoRelect

+0

这个问题怎么来得到10k +用户的回答?为reall ??,我以为它只是像我这样的低代表妓女,追逐这些..嗯 – Elltz

+0

@NoRelect对不起,我的意思是oca和ocp都。 –

回答

6

=是赋值运算符,==是比较运算符。但

x = y 

不是y值仅分配给x,它也回报该值。由于我们可以做的事情一样x=(y=1)(我们甚至可以在这里放下括号),将分配给1y,然后1会被从该表达式返回并分配给x

在你的情况在if (b = true)第一true将被分配到b那么它将返回,所以你最终if(true)所以它总是从分支执行代码为布尔值。


这往往会造成印刷错误的,因为在大多数情况下,我们希望==(等于运算符),而不是=(赋值运算符)。

为了避免这种错误,我们可以编写代码就像

  • if (b){..} - 因为b == true总是b我们跳过== true一部分。 if可以使用的b价值而不是评估b == true。当我们想用否定的,而不是==false我们可以使用Yoda conditionsif(true == b){..}if(!b){..}
  • - 如果错误地,我们将使用=代替==我们将得到编译错误,这将告诉我们吧,因为我们不能分配什么true,我们只能赋值变量
2

这是不是一个很好的做法

Boolean.valueOf(b = true),,你应该避免做这样的,现在有关问题>

if (b = true)是一样的

b = true; 
if (b) 

因此,条件总是满足

与此类似。

if (b = false) 

将永远不会执行...

附加信息:

那种错别字/错误是由一般初级开发者所做的......

一些在历史上,当的发展,它来了一个解决方案...

所谓的JODA条件(称为像主JODA从星星战争......)

如此,JODA-条件将在这种情况下,安全的,因为你可以试着这样做:

if (true = b) { 
     // code here 
    } 

但因为抱怨就不会编译:

的左手边的作业必须是一个变量,

争议仍然是开放的关于有多好的想法是,代码更像那样的可读性等......,

0

if期望布尔类型的表达式。

布尔变量的类型为...布尔。

所以,当你把一个布尔变量后面的,如果可能会发生什么?

1

首先让我们通过查看if语句的结构:

if (<boolean-expression>) { 
    ... 
} 

<boolean-expression>可以计算结果为boolean任何表情。最常见地,这是一个逻辑表达式,即具有比较运算符和/或一些逻辑运算符的表达式,如&&||,和!

但是,表达式可能是一个方法的调用返回boolean,例如:

if (list.isEmpty()) { 
    ... 
} 

接下来,让我们来看看一个赋值表达式。这是一个副作用的表达。右侧进行评估并分配到左侧。赋值表达式的值是赋值后变量的值。

就你而言,作业为b = true,所以表达式的值为true。其插入第一部分解释了为什么你,你看到的结果 - b = true

if (b = true) { 
    ... 
} 

是一个有效的布尔表达式返回true,所以代码要求,并且可以正常运行。更常见的情况下使用的分配结果保存以供将来参考,像这样:

if (b = list.isEmpty()) { 
    ... 
} 

这让你到外面list.isEmpty()条件的结果,而无需再次调用方法。

说明:尽管在条件内部进行赋值是一种有效的做法,但情况并不常见,所以应该对其使用进行大量评论。

相关问题