2 qq 27192089 qq_27192089 于 2015.06.11 22:50 提问

java运算符的优先级和%取模

int a=2 ; int b=a+3*a++ ;
b的输出值为什么是8 不是9吗怎么变成8啦

13个回答

caozhy
caozhy   Ds   Rxr 2015.06.11 23:00

++优先级虽然高,但是第一个a编译器先对它取值了。
也许你觉得第一个a应该是a自增1以后的值。但是编译器不这么认为。
这种代码在C++中是未定义行为的代码,换言之语法规范没有规定结果是多少,不同的编译器可以产生不同的结果。
我不清楚Java中有没有规定,但是可以肯定的是,这种模棱两可的代码绝对不要在你写程序的时候写出来。

caozhy
caozhy   Ds   Rxr 2015.06.12 00:10

这段代码的正确写法取决于你要做什么。如果你希望a先自增,写成
a++;
int b=a+3*a;
如果你希望a后自增,那么写成
int b=a+3*a;
a++,如果你希望a在4*a后自增,那么写
int b = 3 * a;
int c = a;
a++;
b = a + b;
总之,一个原则是,不要在表达式中使用产生副作用(表达式求值会改变表达式,叫做副作用)的写法。

lang523493505
lang523493505   2015.06.11 22:56

++在后是先运算再自增的,所以是2+3×2

Hammer_DA
Hammer_DA   2015.06.11 23:20

a++是最后的。相当于b=a+3*a;a++;

qq_27192089
qq_27192089   2015.06.11 23:38

能说的在详细些吗 第一个a编译器为什么不认

caozhy
caozhy 我说的不是不认,而是编译器对代码的理解和你的不同,它不这么“认为”。
2 年多之前 回复
qq_27192089
qq_27192089   2015.06.11 23:43

这段代码正确的写法是什么

lover_hui
lover_hui   2015.06.11 23:47

a++是先取a再++所以是8

weixin_28661931
weixin_28661931   2015.06.11 23:49

i++是先使用i,在+,++i是先加在使用

danielinbiti
danielinbiti   Ds   Rxr 2015.06.12 00:00
 int a=2 ;//这就不说了,就是2
 int b=a+3*a++
 这句话在java编译器中,因为+号是双目运算,需要取2个数入栈,第一个数a(入栈时值是2),另一个数(3*a++),3*a++,因为是乘,比加优先级高,需要等乘法结果,另外乘法是双目运算,需要取2个数入栈,取3入栈,取a入栈(入栈时值是2)。根据优先级,先算++,再乘法,再加法,但++改变的是变量a的值,不改变栈中的值。所以栈中运算是2+3*2=8
 如果要达到9的效果,那需要改成
 int b=3*a++ + a;  
 不过java的++后缀操作别做这么复杂的操作,很容易出问题。编译方式和c等不一样
LD1663408479
LD1663408479   2015.06.12 00:21

这程序不论怎么都得不到9啊? 这么做就行

int a=2;
int b=a+3*++a ; //这个b=11;++a 是先执行a+1后,再进行运算的

int b=a+3*a++ ;//这个b=8; a++ 是先进行运算,之后再进行a+1;

如果从程序上最后输出a的话,a的值都为3

共13条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片