范围是否影响函数调用中的前后增量?

时间:2014-07-22 19:13:19

标签: c post-increment pre-increment

首先,这是我的第一个问题,请原谅我有任何错误。 我在下面看到了这个程序:

#include<stdio.h>
main()
{
   int i=2;
   void add();
   add(i++,--i);
   printf("/ni=%d ",i);
}
void add(int a ,int b)
{
    printf("/na=%d b=%d",a,b);
}

输出结果为:

 a=1 b=2
 i=2

这也发布在以下链接中:

Pre increment and post increment function call

当我做了一个小实验时,我发现如果你做了声明&#34; int i;&#34;全局,然后输出更改为:

a=1 b=1
i=2

当我搜索解释时,我发现在函数调用中,参数总是从右侧推入堆栈。 这解释了第一个输出,但你如何解释第二个输出?

如果变量是全局的,如何评估后增量和前增量? 或者我把它全部解释错了?

1 个答案:

答案 0 :(得分:3)

add(i++,--i);

这是未定义的行为:未指定函数调用参数的评估顺序,这意味着未指定是先评估i++还是--i还是交叉评估。

另一种措辞方式是变量i在两个连续序列点之间被多次修改,即未定义行为。 (这里的,(逗号)是函数参数的分隔符,不会引入序列点。)

您可以在此处找到更多信息:

Undefined behavior and sequence points
Why are these constructs (using ++) undefined behavior?(感谢@chris)