int number;
number = 80;
number = (int)math.sqrt(number++)
System.out.println(number)
这是上面的代码。我是编程新手,对数学有很好的理解。
我知道 SQRT 是 8。但是在这种情况下,我很困惑为什么答案不是 9。
我知道 ++VAR 和 VAR++ 以及它如何影响答案,但是鉴于 PLUS 在打印代码之上,我很困惑为什么不将一个添加到八个然后打印数字 9。
通过将整个表达式的结果分配回 来覆盖赋值右侧操作数中++
的更新。number
number
JLS§15.26.1涵盖了这一点。以下是该赋值表达式中发生的情况:
80
是从number
number
增加到 81(这无关紧要)math.sqrt
80
使用上面读取的值调用math.sqrt
转换为int
8
) 存储在number
请注意上述步骤 2.1 和 2.2 的顺序。那是因为你使用了 postfix number++
。如果您使用++number
.
右侧的 on 对表达式的结果没有任何影响++
。number
(在 Java 中。在其他一些语言中,这将被视为未定义行为,允许编译器做任何它想做的事情。)
特别是(因为您提到期望获得 value 9
),++
在分配结果存储在number
. number
在将其传递给时读取 的值后立即应用它math.sqrt
。
number++
postincrements,表示表达式在平方根函数内被计算为 80。
80 的平方根严格小于 9,所以它的整数转换(用 完成(int)
)是 8。
number = (int)math.sqrt(number++) ,
这里首先计算表达式,然后增加数字,这就是为什么。
如果您将其更改为
number = (int)math.sqrt(++number) ,
然后它会工作
在 java 中,后自增会在计算表达式时影响变量,而不是在语句运行之后。所以变量递增到 81,之前的值 80 被传递给 sqrt,最后被赋值为 8。