这是我在这里发表的第一篇文章,请原谅任何协议错误。
我的问题只是试图了解以下Java代码发生了什么。我完全理解括号的使用会澄清一切,但结果输出似乎是在面对有关Java操作顺序的约定时出现的。
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);
}
}
输出是: 短 13
显然++ num没有执行。如果观察到严格的操作顺序,它应该是第一件事。它没有。接下来是&&。如果&&通过优先于||的顺序完成,然后相同......首先应该发生++ num。它没有。所以,对我而言,似乎输出是用||确定的首先执行,短接++ num,然后使用&&,导致短被打印。操作规则的顺序是否被忽略,布尔表达式是从左到右执行的?增量运算符是否导致不规则行为?
感谢您对此代码实际发生的任何见解。
答案 0 :(得分:6)
这与优先级/关联性(它处理表达式的解析方式)无关......这与Java评估顺序有关 - 它是从左到右。你似乎误解了短路逻辑是如何工作的。
&&
和||
运算符对两个布尔表达式执行 Conditional-AND 和 Conditional-OR 运算。这些操作员表现出短路"行为,这意味着仅在需要时才评估第二个操作数。
现在,让我们尝试逐步评估这个表达式......
total > 4 || ++num > 15 && total > 0
由于total > 4
的计算结果为true
,因此条件的计算结果为true
,并立即采用if
分支,而不是评估条件的其余部分。
如果您将total
更改为等于4
,则短路OR的左操作数(total > 4
)为false
,因此它会评估右侧 - 操作数(++num > 15 && total > 0
)。
如果将num
更改为等于15
,则短路AND左操作数(++num > 15
)将评估为true
,从而最终评估AND权限-operand(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);
您可以在relevant Java Tutorial中阅读有关Java条件运算符的更多信息。
答案 1 :(得分:4)
通过使用double或(||),激活java的短路; (使用单个|如果你不想要这个)。一旦它达到一切都是真的,并且它遇到短路或(||),(或某些事情是错误的,它会碰到一个短路&(&&)),它就会爆发。所以在你的情况下,total大于4,所以它停在那里(由于||),并返回true到if语句,并打印出short;它永远不会到达增加num变量的部分,因为它看不需要检查
答案 2 :(得分:3)
发生了什么short-circuit evaluation。 total > 4
为true
,构成整个条件true
。我们甚至不需要在||
之后查看后面的内容。这是一种非常常见的运行时优化,也存在于C,C ++和Javascript(以及许多其他)中。你观察到了它的副作用。
请注意,短路可以对您有利(例如,检查||
或&&
左侧的(非)null
值或者它可以让你困惑(就像你在问题中所做的那样)。明智地使用它,年轻的padawan。
答案 3 :(得分:0)
计算机将在你的布尔表达式下像这个总> 4 || (++ num> 15&& total> 0)。它就像标准SQL中的表达式。它找到&&并在左侧和右侧抓住2个表达式,然后像我刚才那样把它们放在一个括号中。 在您的代码中,total = 9> 4和++ num = 14< 15< 15> 0,因此结果为true ||(false&& true)= true。 终端打印出“short”和num,即13。
希望我的回答能帮到你。 如果我错了,请纠正我
答案 4 :(得分:0)
我认为在if子句中使用时它不会改变变量的实际值。存储在存储器中的值保持不变。它就像表达式
中的num + 1> 15