首先,这是我在这里的第一个问题,请原谅我的错误。。我在下面看到了这个程序:
#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
这也发布在下面的链接中:
增量前和增量后函数调用
当我做了一个小实验时,我发现如果将声明"int i;"设为全局,那么输出将更改为:
a=1 b=1
i=2
当我搜索解释时,我发现在函数调用中,参数总是从右边推到堆栈中。这解释了第一个输出,但你如何解释第二个输出?
在变量为全局变量的情况下,如何评估增量后和增量前?还是我解释错了?
add(i++,--i);
这是未定义的行为:函数调用参数的求值顺序是未指定的,这意味着未指定是首先求值i++
还是先求值--i
,甚至是交错求值。
另一种表述方式是,变量i
在两个连续的序列点之间被修改不止一次,这是未定义的行为。(这里的,
(逗号(是函数参数的分隔符,不引入序列点。(
您可以在这里找到更多信息:
未定义的行为和序列点
为什么这些构造(使用++(是未定义的行为?(谢谢@chris(