【问题标题】:Java increment logical problem (increment in conditional statements)Java增量逻辑问题(条件语句中的增量)
【发布时间】:2020-07-30 06:10:29
【问题描述】:

我得到了这个评估,但这两个问题一直萦绕在我的脑海中。这两个代码看起来相似,但根据增量给出不同的输出

代码 #1:

package com.company;
class Main {
public static void main(String [] args) {
                boolean x = true;
                boolean y = false;
                short z = 42;

                if((z++ == 42) && (y = true))
                    z++;
                if((x = false) || (++z == 45))
                    z++;
                System.out.println("z = " + z);
                }
}

这段代码看起来不错,它增加了应该增加的值并将该值返回到“z”,从而输出

输出:

z = 46

Process finished with exit code 0

但第二个代码似乎不同,因为它不保存增量值

代码 #2: 包 com.company;

公共类Test2

{
    public static void main(String [] args) {
        boolean x = true;
        boolean y = false;
        short z = 42;
        if((x == true) && (y = true))
            z++;
        if((y == true) || (++z == 44))
            z++;
        System.out.println("z = " + z);
    }
}

这不会像第一个代码那样保存第二个 if 条件语句的增量

输出:

z = 44

Process finished with exit code 0

我错过了什么重要的东西吗?

【问题讨论】:

  • 您是否遗漏了一些重要的事情?是的,不要写那样的混乱和困难的代码。
  • 在第一个中,最后的 z++ 不在条件内。 (大多数)空白在 Java 中没有语义意义,不像 Python。
  • 编写代码的是我的导师。我正在尝试了解输出以及为什么会这样
  • 安迪对不起我的错。我是将系统置于最终 if 语句下方以便我理解的人,即使我删除了该系统,它仍然是相同的输出,即 46

标签: java conditional-statements increment


【解决方案1】:

这是因为逻辑或运算符(||)是短路:如果第一个条件已知为真,那么第二个条件根本不执行。

这意味着(++z == 44)中的z++没有被执行,因此最终结果是44而不是45。

如 cmets 中所述,按位 OR 运算符 (|) 不会短路,因此始终执行两条语句。


这样的代码可能会非常混乱。代码应该主要是可读的。永远不要在条件中使用赋值。 b = false 很容易与 b == false 混淆。还要避免在其他操作中间使用增量运算符,仅作为独立表达式。

【讨论】:

  • @TenebrisMortem 如果您不想要短路行为,可以使用按位运算符|(单管道)。