代码之家  ›  专栏  ›  技术社区  ›  Jronny

Java如何使用普通操作符执行快捷操作有区别吗?

  •  0
  • Jronny  · 技术社区  · 16 年前

    我正在研究一个关于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 2 2
    1 3 3 3
    1 4 6 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 2 2
    1 3 3 3
    1 4 4 4 0 0

    知道一定发生了什么吗?事先谢谢!

    3 回复  |  直到 16 年前
        1
  •  13
  •   dave4420    16 年前

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

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

    是一样的

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

    括号很重要。 (i - j) / (j + 1) 大多数情况下不是一个整数,但是Java将它循环到一个整数。

    你先做的方式

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

    乘法发生在除法之前,所以您不会得到任何舍入误差。

        2
  •  5
  •   extraneon    16 年前

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

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

    代替

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

    你可能想要。

        3
  •  2
  •   bmargulies    16 年前

    看起来像整数除法和运算顺序。尝试添加一些括号,我认为您最终将获得相同的结果。如果用整数除以2/3,得到0。所以,如果你先做一些乘法运算就很重要了。