c-作用域是否影响函数调用中的前增量和后增量



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

#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(

最新更新