为什么 System.out.println(3+(4-3)/2);在 java 中打印 3 而不是 2 但 System.out.println(4/2) 正确打印 2

Why System.out.println(3+(4-3)/2); is printing 3 but not 2 in java but System.out.println(4/2) is printing 2 correctly

为什么 System.out.println(3+(4-3)/2);在 java 中打印 3 而不是 2,但 System.out.println(4/2) 正确打印 2。

    public class Sum {

        public static void main(String[] args) {
            System.out.println(3 + (4 - 3) / 2);
        }
    }

就像在数学中一样 Java 乘法和除法的优先级高于加法和减法。因此,您的表达式等效于以下内容:

    3 + ((4 - 3) / 2)

那么让我们一步步来吧:

    3 + (4 - 3) / 2 = 3 + ((4 - 3) / 2)
                    = 3 + (1 / 2)
                    = 3 + 0
                    = 3

正如其他人所说,Java 中的整数除法与数学中的除法不同,因为任何余数都会被丢弃。在学校里我们知道 1 / 2 是 0 余数是 1。在 Java 中我们只得到 0.

顺便说一句:要得到余数,即 1,您可以 1 % 2(4 - 3) % 2。而如果我们想要除法的结果是0.5,就需要对浮点数进行除法,比如1.0 / 2.0或者(4.0 - 3.0) / 2.0.

历史视角:我在这里应用的计算规则绝不是Java独有的。精确的规则是从 C++ 和 C 那里接管的,它们可能是从更古老的编程语言那里接管的。在几乎所有编程语言中,您都会发现非常相似的规则。

您是否期望从左到右的评估 除了括号?另一对括号可以保证:

    System.out.println((3 + (4 - 3)) / 2);

输出为:

2

我从你的问题中了解到这是你所期望的输出。

不过,这么多嵌套的括号变得难以阅读,所以最好先将值赋给变量:

    int result = (3 + (4 - 3)) / 2;
    System.out.println(result);

当然,输出还是一样的。您可能已经意识到现在的计算是:

    (3 + (4 - 3)) / 2 = (3 + 1) / 2
                      = 4 / 2
                      = 2

Link: Operator Precedence in Java