-2
int number; 
number = 80; 

number = (int)math.sqrt(number++) 
System.out.println(number) 

这是上面的代码。我是编程新手,对数学有很好的理解。

我知道 SQRT 是 8。但是在这种情况下,我很困惑为什么答案不是 9。

我知道 ++VAR 和 VAR++ 以及它如何影响答案,但是鉴于 PLUS 在打印代码之上,我很困惑为什么不将一个添加到八个然后打印数字 9。

4

4 回答 4

3

通过将整个表达式的结果分配回 来覆盖赋值右侧操作数中++的更新。numbernumber

JLS§15.26.1涵盖了这一点。以下是该赋值表达式中发生的情况:

  1. 左侧确定为变量
  2. 赋值表达式的右侧被求值:
    1. 该值80是从number
    2. number增加到 81(这无关紧要)
    3. math.sqrt80使用上面读取的值调用
    4. 的结果math.sqrt转换为int
  3. 上面 #2 的结果 ( 8) 存储在number

请注意上述步骤 2.1 和 2.2 的顺序。那是因为你使用了 postfix number++。如果您使用++number.

右侧的 on 对表达式的结果没有任何影响++number(在 Java 中。在其他一些语言中,这将被视为未定义行为,允许编译器做任何它想做的事情。)

特别是(因为您提到期望获得 value 9),++在分配结果存储在number. number在将其传递给时读取 的值后立即应用它math.sqrt

于 2016-10-29T13:18:39.400 回答
1

number++postincrements,表示表达式在平方根函数内被计算为 80。

80 的平方根严格小于 9,所以它的整数转换(用 完成(int))是 8。

于 2016-10-29T13:15:33.980 回答
1
number = (int)math.sqrt(number++) ,

这里首先计算表达式,然后增加数字,这就是为什么。

如果您将其更改为

number = (int)math.sqrt(++number) ,

然后它会工作

于 2016-10-29T13:16:21.590 回答
0

在 java 中,后自增会在计算表达式时影响变量,而不是在语句运行之后。所以变量递增到 81,之前的值 80 被传递给 sqrt,最后被赋值为 8。

于 2016-10-29T13:21:04.677 回答