首先,这是我的第一个问题,请原谅我有任何错误。 我在下面看到了这个程序:
#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
当我搜索解释时,我发现在函数调用中,参数总是从右侧推入堆栈。 这解释了第一个输出,但你如何解释第二个输出?
如果变量是全局的,如何评估后增量和前增量? 或者我把它全部解释错了?
答案 0 :(得分:3)
add(i++,--i);
这是未定义的行为:未指定函数调用参数的评估顺序,这意味着未指定是先评估i++
还是--i
还是交叉评估。
另一种措辞方式是变量i
在两个连续序列点之间被多次修改,即未定义行为。 (这里的,
(逗号)是函数参数的分隔符,不会引入序列点。)
您可以在此处找到更多信息:
Undefined behavior and sequence points
Why are these constructs (using ++) undefined behavior?(感谢@chris)