这是我在这里发表的第一篇文章,请原谅任何协议错误.
我的问题只是试图通过以下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);
}
}
Run Code Online (Sandbox Code Playgroud)
输出为:短13
显然++ num没有执行.如果观察到严格的操作顺序,它应该是第一件事.它没有.接下来就是&&.如果&&按优先顺序超过||完成,则相同的...... ++ num应首先发生.它没有.所以,对我而言,似乎输出是用||确定的 首先执行,短接++ num,然后使用&&,导致短打印.操作规则的顺序是否被忽略,布尔表达式是从左到右执行的?增量运算符是否导致不规则行为?
感谢您对此代码实际发生的任何见解.
这与优先级/关联性(它处理如何解析表达式)无关......这与Java评估顺序有关 - 这是从左到右.您似乎误解了短路逻辑的工作原理.
在
&&与||运营商进行有条件-AND和条件,或在两个布尔表达式运算.这些运算符表现出"短路"行为,这意味着仅在需要时才评估第二个操作数.
现在,让我们尝试逐步评估这个表达式......
total > 4 || ++num > 15 && total > 0
Run Code Online (Sandbox Code Playgroud)
由于total > 4求值为true,条件求值为,true并且if立即采用分支而不是评估条件的其余部分.
如果total改为n 4,则total > 4短路OR 的左操作数()为false,因此它评估右操作数(++num > 15 && total > 0).
如果更改num为相等15,则短路AND左操作数(++num > 15)求值true,从而最终计算AND右操作数(total > 0)以确定条件是否为true.如果total > 0是假,那么条件也是false.
下面是为了清晰起见而重写的代码,以突出显示流程.
if (total > 4) {
System.out.println("short");
} else {
if (++num > 15) {
if (total > 0) {
System.out.println("short");
}
}
}
System.out.println(num);
Run Code Online (Sandbox Code Playgroud)
您可以在相关的Java Tutorial中阅读有关Java条件运算符的更多信息.