请考虑以下代码段:
int i=10;
printf("%d %d %d",i,++i,i--);
在C / C ++中未指定评估函数参数的顺序。因此导致未指定的行为。
我是正确还是缺少某些东西?请解释一下。
编辑:嗯,有些成员认为它是重复的,这是一个未定义的行为。不管怎样,来自C99:
6.5.2.2(10)
功能指示符的评估顺序,实际参数,以及 实际参数中的子表达式是未指定,但在实际调用之前有一个序列点。
那么现在的确切命名是什么,未定义或未指定?
答案 0 :(得分:2)
是的,是的。
我认为是因为在不同的平台上使用不同的机制来传递参数,因此可以按不同的顺序评估参数。
答案 1 :(得分:1)
您所看到的是未定义C / C ++规范的示例,因此不同的编译器可以执行他们想要的任何操作。一个编译器可能按从左到右的顺序执行参数,另一个编译器可能按从右到左的顺序执行。编译器随机选择顺序是完全可以的。
您的来源尝试做的一点是,在传递参数时不应该依赖任何顺序。例如,如果你有:
A(DoX(), DoY())
DoX和DoY不能依赖于对方的任何副作用,因为它们是以未定义的顺序执行的。要完全明确,你应该做类似的事情:
int x = DoX();
int y = DoY();
A(x, y);
对于大多数真实世界的生产代码,您不会经常遇到这种情况,但它确实会不时发生。
请注意,这与short circuit evaluation有关,但与{{3}}不同。