-1

在执行以下操作时,我很想看到一个奇怪的错误:

int width = 300;
int var1 = width/3;
int var2 = width * 1/3;
int var3 = width * 2/3;
int var4 = width*(1/3);
int var5 = width * (int)(1/3);
int var6 = (int)(width*(1/3));

System.out.println("Var1: " + var1);
System.out.println("Var2: " + var2);
System.out.println("Var3: " + var3);
System.out.println("Var4: " + var4);
System.out.println("Var5: " + var5);
System.out.println("Var6: " + var6);

输出是这样的:

Var1: 100
Var2: 100
Var3: 200
Var4: 0
Var5: 0
Var6: 0

为什么最后三个操作返回0?周围的括号1/3似乎改变了它执行计算的方式,但甚至试图将其转换为int也不会改变输出。

我正在使用BlueJ IDEJava version 1.7.0_17


编辑

我找到了答案。这是由于操作顺序。parens除法首先发生的原因是int1/3 或 2/3 总是等于0。如果我允许width * 2在除以3一切之前发生就可以了,因为数字大于1

有时它只是基本的数学...... :)

4

2 回答 2

3

对于第四种情况,试试这个,请注意,通过添加小数点,我们强制进行小数除法,而不是之前的整数除法:

int var4 = width*(1/3.0);

对于最后两种情况,试试这个——尽管这最终等同于以前的其他情况!

int var5 = width * (1/3);
int var6 = (width*(1/3));

请注意,演员(int)1/3正在0使除法回归0,并且0时间任何东西都会回归......好吧,0。如果你把演员表留在原地,这两种情况是不可能发生的。

于 2013-06-18T02:29:34.890 回答
1

它是相关的,因此也请参见优先顺序

于 2013-06-18T02:42:18.140 回答