【问题标题】:Multiple && Statements - Efficiency [duplicate]多个 && 语句 - 效率 [重复]
【发布时间】:2012-10-08 06:23:51
【问题描述】:

可能重复:
Does Java evaluate remaining conditions after boolean result is known?

在 java 中使用多个 && 语句执行代码时,如果第一个布尔比较解析为 false,编译器是否会继续解析其他布尔比较?

if (1==2 && 3==4 && 4==5) { Do Something }

一旦确定1==2为假,编译器会立即跳出if语句还是继续解析3==44==5

【问题讨论】:

标签: java performance


【解决方案1】:

&& 的情况下,它会在检测到其中一个条件为假时停止评估。这称为short circuit evaluation

【讨论】:

    【解决方案2】:

    “编程语言中的短路评估”

    在任何逻辑表达式most compiler stop evaluation expression as soon as result evaluated 的情况下。 不仅在 Java 中,而且在几乎所有语言中。 (但不是全部,例如 VB6)

    你也可以这样检查:

    i = 0 , j =1;
    我 && ++j;
    system.out.print(" j=" + j);

    j will be 1的值,表示++j没有被执行。

    【讨论】:

    • !!为什么标记为负数?它完全正确..
    【解决方案3】:

    如果第一个布尔比较解析为 false,编译器是否继续解析其他布尔比较

    简短的回答。不!编译器javacJIT 静态分析所有代码。像这样走捷径是不行的。例如如果第二个条件没有编译,不管第一个条件如何,你总是会得到一个编译错误。

    您可能想问的是;如果第一个或第二个条件是false,程序会执行其他条件吗?在这种情况下,它不会。

    【讨论】:

    • 我不认为 OP 真的意味着编译器。 :)
    【解决方案4】:

    这对编译器没有影响——它所做的只是将布尔比较解析为机器代码,由一个或多个 .class 文件表示。

    就实际运行时间而言...如果我在计算机科学课上没记错的话,Tarun 和 Lews 的答案都是正确的——一旦到达不正确的表达式,比较就会短路。

    【讨论】:

      【解决方案5】:

      IF "1==2" 为假,编译器会立即跳出 if 语句。

      【讨论】:

        【解决方案6】:

        &&

        - 以上是short-circuit AND operator。如果第一个条件为假,则不评估第二个条件。

        例如:

        if ((a==false) && (b==true)){
        
        
          }
        

        第一次评估后,以上将停止

        -如果你想强制评估两个条件,那么试试Non-Short Circuit AND (&)

        【讨论】:

          【解决方案7】:

          标题中关键字“效率”的旁注:- 正如其他答案所述,您的基本问题很容易回答,因此这不是效率问题,而是如果您出于某种原因需要评估所有表达式的问题,例如在执行更改状态的代码时(顺便说一句,这根本不是好的编码)。

          但是,如果您从执行速度的角度来考虑“效率”,那么您几乎不必在该级别上进行优化,编译器会为您执行此操作,或者您不会注意到差异。这在某些时间关键的操作或在非常大的循环中运行的操作中可能很重要,但在几乎所有其他情况下,编写干净的代码更为重要,以便其他人可以很好地阅读它。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-02-02
            • 1970-01-01
            • 2012-05-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-12-13
            相关资源
            最近更新 更多