Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java布尔表达式行为_Java_Boolean - Fatal编程技术网

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) {

这是我在这里的第一篇文章,所以请原谅任何协议错误

我的问题只是试图理解下面的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);
   }
}
输出为: 短的 十三,

很明显,++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有关函数的简单代码,请参阅我的原始帖子