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