回复 4楼 testpaper
在C/C++中,函数的参数们的“评估顺序”是“未指定”的,
函数的参数们的“评估”之间是无“序列点”的,
那么在两个序列点之间,若存在“副作用”的冲突,则是“未定义行为”。
虽然拗口,但很好判断。以
int a=1;
printf("%d %d %d %d %d\n",a,a=a+1,a+3,a,a=a+5);
为例,假如先评估 a=a+1,那么 a 就变为2了,printf("%d %d %d %d %d\n",
2,……
,假如先评估 a=a+5,那么 a 就变为5了,printf("%d %d %d %d %d\n",
5,……
而先评估谁并没有任何规定。
(很多外行人会误以为“从左到右”或“从右到左”,没有这规定;即使有这规定,还因为缺少序列点而一样属于“未定义行为”。举个例子:
假使先评估 a=a+1 再评估 a=a+5,那么评估 a=a+5 时是使用a=1还是a=2呢?因为无序列点,所以高兴用谁就用谁)
楼上说不同的编译器结果不一样,这是不准确的,因为 不同的编译器结果不一样 属于“实现定义行为”,
“未定义行为”是最恶劣的,因为“未定义行为”就是编译器从来没考虑过出现这种情况应该怎么办。同一个程序可能每次运行结果都不一样,有时输出一个数值,有时启动一个游戏。