Java如何使用常规运算符执行操作有什么不同?

时间:2009-11-26 14:06:34

标签: java operators operator-precedence

我正在开发一个关于pascal三角形的java程序。

所以这就是它的编码方式:

for(int i = 0; i < 5; i++){
    for(int j = 0, x = 1; j <= i; j++){
        System.out.print(x + " ");
        x = x * (i - j) / (j + 1);
    }
    System.out.println();
}

它显示:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

但是当我尝试将代码更改为:

for(int i = 0; i < 5; i++){
    for(int j = 0, x = 1; j <= i; j++){
        System.out.print(x + " ");
        x *= (i - j) / (j + 1);
    }
    System.out.println();
}

并且您可能已经注意到,只有运算符已更改为* =,但结果为:

1
1 1
1 2 0
1 3 3 0
1 4 4 0 0

知道发生了什么事吗?提前谢谢!

3 个答案:

答案 0 :(得分:13)

这是因为您使用了错误顺序的整数运算。

x *= (i - j) / (j + 1);

相同
x = x * ((i - j) / (j + 1));

括号很重要。 (i - j) / (j + 1)在大多数情况下不是一个整数,但无论如何,java将它舍入为整数。

你先做的方式

x = x * (i - j) / (j + 1);

乘法发生在除法之前,因此不会出现任何舍入误差。

答案 1 :(得分:5)

您将高优先级*切换为低优先级* =导致

x = x * ((i - j) / (j + 1)); 

代替

x = (x * (i - j)) / (j + 1);

你可能想要的。

答案 2 :(得分:2)

看起来像整数除法与操作顺序。尝试添加一些括号,我想你最终会得到相同的结果。如果你把整数除以2/3,你得到0.所以如果你先做一些乘法就很重要。