Java自增逻辑问题(条件语句中自增)

标签 java conditional-statements increment

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

代码#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;

公开课测试2

{
    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

我错过了什么重要的事情吗?

最佳答案

这是因为逻辑 OR 运算符 (||) 是短路:如果已知第一个条件为真,则第二个条件根本没有执行

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

正如评论中提到的,按位 OR 运算符 (|) 不是短路,因此两条语句始终都会执行。

<小时/>

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

关于Java自增逻辑问题(条件语句中自增),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61259808/

相关文章:

java - 允许 java 程序自动更新的小类

c - 尝试理解 pthread_cond_signal()

c# - 是否允许多个条件使用 switch-case 语句?

c - 如何根据条件语句和 C 输出来修复程序的运行?

sql - 自动增量/身份可以检测值本身吗?

c# - Lambda 参数在稍后范围内访问字段时与类字段冲突

java - 标准控制台输入

java - Android - 选择 HTTP Java 库

c++ - 递增解引用迭代器

java - 将 Java (JRE) 捆绑到 spring-boot 包/jar 中?