未定义/未指定?

时间:2009-12-18 21:17:14

标签: c++ c

  

可能重复:
  Why is i = ++i + 1 unspecified behavior?

请考虑以下代码段:

int i=10;
printf("%d %d %d",i,++i,i--);

在C / C ++中未指定评估函数参数的顺序。因此导致未指定的行为。

我是正确还是缺少某些东西?请解释一下。

编辑:嗯,有些成员认为它是重复的,这是一个未定义的行为。不管怎样,来自C99:

6.5.2.2(10)

功能指示符的评估顺序,实际参数,以及 实际参数中的子表达式是未指定,但在实际调用之前有一个序列点。

那么现在的确切命名是什么,未定义未指定

2 个答案:

答案 0 :(得分:2)

是的,是的。

我认为是因为在不同的平台上使用不同的机制来传递参数,因此可以按不同的顺序评估参数。

答案 1 :(得分:1)

您所看到的是未定义C / C ++规范的示例,因此不同的编译器可以执行他们想要的任何操作。一个编译器可能按从左到右的顺序执行参数,另一个编译器可能按从右到左的顺序执行。编译器随机选择顺序是完全可以的。

您的来源尝试做的一点是,在传递参数时不应该依赖任何顺序。例如,如果你有:

A(DoX(), DoY())

DoX和DoY不能依赖于对方的任何副作用,因为它们是以未定义的顺序执行的。要完全明确,你应该做类似的事情:

int x = DoX();
int y = DoY();
A(x, y);

对于大多数真实世界的生产代码,您不会经常遇到这种情况,但它确实会不时发生。

请注意,这与short circuit evaluation有关,但与{{3}}不同。