有人可以解释这个数字= 80; number =(int)math.sqrt(number ++);数字= 8?

时间:2016-10-29 13:13:11

标签: java math.sqrt

int number; 
number = 80; 

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

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

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

我知道++ VAR和VAR ++以及它如何影响答案但是考虑到PLUS高于打印代码,我很困惑为什么没有添加到8,那么打印数字9。

4 个答案:

答案 0 :(得分:3)

通过将整个表达式的结果分配回++,覆盖了分配右侧操作数中的number更新{/ 1}}。

这由JLS§15.26.1涵盖。这是在赋值表达式中发生的事情:

  1. 左侧被确定为变量
  2. 评估赋值表达式的右侧:
    1. number
    2. 读取值80
    3. number增加到81(这无关紧要)
    4. number的调用值math.sqrt已在上面阅读
    5. 80的结果转换为math.sqrt
  3. 上述#2(int)的结果存储在8
  4. 请注意上面步骤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。