Java布尔表达式行为
这是我在这里的第一篇文章,所以请原谅任何协议错误 我的问题只是试图理解下面的Java代码发生了什么。我完全理解使用括号可以澄清一切,但结果似乎与Java操作顺序的约定背道而驰Java布尔表达式行为,java,boolean,Java,Boolean,这是我在这里的第一篇文章,所以请原谅任何协议错误 我的问题只是试图理解下面的Java代码发生了什么。我完全理解使用括号可以澄清一切,但结果似乎与Java操作顺序的约定背道而驰 public class Tester { public static void main(String[] args) { int total=9, num=13; if (total>4 || ++num>15 && total>0) {
public class Tester
{
public static void main(String[] args)
{
int total=9, num=13;
if (total>4 || ++num>15 && total>0)
{
System.out.println("short");
}
System.out.println(num);
}
}
输出为:
短的
十三,
很明显,++num没有执行。如果严格的操作顺序得到遵守,这应该是第一件事。没有。接下来是&&。如果&&是按优先于| |的顺序执行的,那么相同的…应该首先执行++num。没有。因此,在我看来,输出似乎是由首先执行的| |决定的,短接++num,然后使用&,导致短打印。操作规则的顺序是否被忽略,布尔表达式是否从左到右执行?增量运算符是否导致不规则行为
感谢您对这段代码的实际情况的了解。通过使用double or(| |),您激活了java的短路;(如果您不想这样做,请使用一个|)。当它到达一个点,一切都是真的,它碰到一个短路或(| |),或一些错误的东西,它碰到一个短路&(&&),它就会爆发。在您的例子中,total大于4,因此它停在那里(由于| |),并返回true到if语句,并输出short;它永远不会到达递增num变量的部分,因为它认为不需要检查这与优先级/关联性(处理表达式的解析方式)无关。。。这与Java求值顺序有关——从左到右。您似乎误解了短路逻辑的工作原理
&&
和|
运算符对两个布尔表达式执行条件and和条件OR运算。这些运算符表现出“短路”行为,这意味着只有在需要时才计算第二个操作数
现在,让我们尝试递增地计算这个表达式
total > 4 || ++num > 15 && total > 0
由于total>4
计算结果为true
,因此条件计算结果为true
,并且立即执行if
分支,而不是计算其余条件
如果将total
更改为等于4
,则短路OR的左操作数(total>4
)为false
,因此它计算右操作数(++num>15&&total>0
)
如果将num
更改为等于15
,则短路和左操作数(++num>15
)计算结果为true
,因此它最终计算右操作数(total>0
),以确定条件是否为true
。如果total>0
为false,则条件也为false
下面是为清晰起见重写的代码,以突出显示流程
if (total > 4) {
System.out.println("short");
} else {
if (++num > 15) {
if (total > 0) {
System.out.println("short");
}
}
}
System.out.println(num);
您可以在中阅读有关Java条件运算符的更多信息。正在进行的是total>4
为true
,使整个条件为true
。我们甚至不需要查看| |
之后的内容。这是一个非常常见的运行时优化,也存在于C、C++和JavaScript(许多其他许多)中。你观察到了它的副作用
请注意,短路可能对您有利(例如,检查
|
或&&
左侧的(非-null
值),也可能会让您困惑(就像您在问题中所做的那样)。明智地使用它,年轻的学徒。计算机会在你下面显示这样的布尔表达式:总计>4 | |(++num>15&&total>0)。它类似于标准SQL中的表达式。它在左右两侧找到&&并抓取2个表达式,然后像我刚才做的那样将它们放在一个括号中。
在代码中,total=9>4,++num=140,因此结果为true | |(false&&true)=true。
终端打印出“short”和num,即13
希望我的回答能帮助你。
如果我错了,请纠正我我认为在If子句中使用时,它不会改变变量的实际值。存储在内存中的值保持不变。就像表达式中的num+1>15一样我确实理解短路或短路所做的优化。但这不是很奇怪吗?前缀运算符++的行为就像它在大多数情况下出现的位置上方有一行
var=var+1
。C++中的相同代码产生14。有人能评论一下C++和java之间的区别吗?@ @安德里奥尼,你确定吗?不是现在:)我需要检查Mac上的gcc,但是我测试的两个Ubuntus(gcc 4.4.3和4.6.3)都呈现:subq$16,%rsp movl$9,-4(%rbp)movl$13,-8(%rbp)cmpl$4,-4(%rbp)jg.L2*addl$1,-8(%rbp)*cmpl$15,-8(%rbp)对于if,jle.L3 cmpl$0,-4(%rbp)jle.L3
。Id est++只发生在| |之后。也许我使用|错误地理解了java程序的输出。咖啡喝得太多:)我理解快餐。如果它短路了,就照你说的做。我的问题是,它为什么要在前面做OR,而当优先级要求先做AND时,这里的逻辑条件(主要)是返回true
或false
,而不是需要遵循数学运算顺序的算术运算。条件句是从左到右计算的,根据我的感觉,这个答案就是正在发生的事情。它是从左到右求解,而不是按优先级求解。OR短路超过++num,将其保留为13,因为total>4为true,然后在&&表达式中使用该true给出最终输出。@user1580609有关函数的简单代码,请参阅我的原始帖子