算术运算符混淆

问题描述:

为什么我在为相同的变量值使用算术运算符时得到两个不同的值。我刚刚改变了我的第二个程序,这导致了不同的输出。任何人都可以告诉我为什么?算术运算符混淆

int number=113; 
int rot=0; 
rot=number%10; 
rot*=100+number/10; 
System.out.println(rot);//333 



    int number=113; 
int rot=0; 
rot=number%10; 
rot=rot*100+number/10; 
System.out.println(rot);//311 
+0

有时,在数学操作数之间添加空格可以增加可读性并使公式更清晰(对于您自己!)。例如。你可以写'rot = rot * 100 + number/10'。 – 2010-01-05 10:18:22

+2

加上括号会使其更加清晰,尽管 – 2010-01-05 10:31:22

+0

括号混淆了像这些imho这样简单的表达式,简单的算术规则对开发人员应该没有问题 – rsp 2010-01-05 11:08:38

在第一部分中,你计算

rot *= 100 + number/10 

这是

rot = rot * (100 + number/10) 

而在第二部分:

rot = rot*100 + number/10 

注意,乘法和除法除了之前去和减法。

问题是,* =有不同的(较低的)优先级比*和+

rot *= 100 + number/10; 

是equavalent到

腐=腐*(100 +数/ 10);

操作precdence可以发现here

好像问题是operator precedence

这意味着num * 10 + 13被视为(num * 10) + 13,即()会根据语言的规则自动添加。

那么,这种差异,在你的榜样,是第一个具有以下含义:

rot*=100+number/10; 
// Is the same as this: 
rot = rot * (100 + (number/10)); 

而第二个含义如下:

rot=rot*100+number/10; 
// Is the same as this: 
rot = (rot * 100) + (number/10); 

由于括号是在不同的地方,这些可能会评估到不同的数字。

+2

-1 - 'rot * = 100 + number/10;'与'rot * 100 + number/10;'和'rot * 100 + number/10;'不同于'rot *(100 +(number/10));'。你有正确的答案,但是出于错误的原因。 – 2010-01-05 10:20:01

+0

@Stephen:谢谢,我已经改变了我认为正确的答案(只是删除了第二步,因为它是错的......不知道我想说什么)。 – 2010-01-05 11:28:47

由于*的高优先级,所以在第二个代码中。 rot * 100将会被计算出来并且将被加上(number/10),所以它的(300 + 11 = 311)。