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

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

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

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

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

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

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

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

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

 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等不一样

这段代码的正确写法取决于你要做什么。如果你希望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;
总之,一个原则是,不要在表达式中使用产生副作用(表达式求值会改变表达式,叫做副作用)的写法。

这程序不论怎么都得不到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

双目运算为什么入栈是时是2啊还有就是如果你希望a在4*a后自增,那么写
int b = 3 * a;
int c = a;
a++;
b = a + b;怎么理解啊

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

这个代码习惯最好要改一下。可能在不同的环境下出现不同的结果。