2011-08-05 71 views
-1

可能重复:
Order of evaluation in C++ function parameters
Parameter evaluation order before a function calling in C请解释此行为?

:~/work_space/cprogs$ !cat 
cat expression_associativity.c 
#include<stdio.h> 

int main() 
{ 

    int i = 0; 

    printf("\n no-incr:%d pre-incr:%d post-incr:%d no-incr:%d post-incr:%d no-incr:%d \n", i, ++i, i++, i, i++, i); 

    return 0; 
} 

:~/work_space/cprogs$ !./ 
./expression_associativity 

no-incr:3 pre-incr:3 post-incr:1 ***no-incr:3*** post-incr:0 ***no-incr:3*** 
:~/work_space/cprogs$ 

为什么最后和中间的 “无增量” 的值被印刷为3?我期待最后一次“不加入”为零,中间的“不加入”为1.

有人可以解释表达式的顺序是什么,为什么我们看到这个值?

回答

2

这是造成未定义的行为。

未指定函数参数的评估顺序,因此结果是未定义的。

未定义行为意味着任何事情都可能发生,行为无法定义。

+0

它实际上是“未指定”,与“未定义”明显不同。 – cnicutar

+0

@cnicutar:我的答案已经表明它是未指定的,在这种情况下未指定的行为会导致未定义的行为。 –

+0

必须看到早期版本 – cnicutar

1

参数的评估顺序未定义;唯一确保的是所有的增量和减量都将在调用函数之前完成。 C标准根本不允许您预测将在此处打印的内容。