int a=2;
System.out.print(a*=a--);
System.out.print(a);
输出结果是是 4 4
第一个4我能理解,之后执行了 a-- 那么 之后的a的值不应该是3吗
a--是副作用表达式,出现再这种等式里,结果是不能确定的。
https://www.cnblogs.com/Lee-geeker/archive/2013/08/02/3232693.html
使用了未定义行为的程序都是错误的,即使程序能够运行,也只是巧合。未定义行为源于编译器不能检测到的程序错误或太麻烦以至无法检测的错误。
不幸的是,含有未定义行为的程序在有些环境或编译器中可以正确执行,但并不能保证同一程序在不同编译器中甚至在当前编译器的后继版本中会继续正确运行,也不能保证程序在一组输入上可以正确运行且在另一组输入上也能正确运行。
看编译器是怎么安排计算的了,不过单从a--的角度来看也应该是4,a--不代表减一会发生在所有操作之后,就像重载的写法
T operator--(T &a){
T temp = a;
a--;
return temp;
}
在返回temp之前其实a已经减一了,只不过返回了之前的值让你觉得是在操作之后才减的。
我认为的执行顺序是这样的
a*= a--
展开:a = a * a--
赋值:a = 2 * a--
a--:2 <= (a = 1)
乘法:a = 2 * temp = a = 2 * 2 = 4
结果:a = 4
从底层执行过程字节码分析是这样的:
a-- 那个局部变量自增操作本质上没有入栈存储,所以对 结果没有作用,最终站顶元素是乘法后的数值 4 ,所以最后打印的也是 4.
a--因为只参与了一次运算,变成a=2*2就是4,因为a--的a先参与了运算,导致第一次打印结果是4,,所以a只被赋值了一次4,第二次就也是4.
不然的话把第二行改成System.out.print(a*=--a);结果应该大不同