【问题标题】:Does scope affects on pre and post increment in function call?范围会影响函数调用中的前后增量吗?
【发布时间】:2014-09-13 18:31:40
【问题描述】:

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

#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

当我做了一个小实验时,我发现如果你声明“int i;”全局,然后输出变化为:

a=1 b=1
i=2

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

如果变量是全局变量,如何评估后增量和前增量? 还是我理解错了?

【问题讨论】:

  • 您的链接已经解释了您的问题的答案。这是未定义的行为。
  • 这两种方式都是未定义的行为。
  • 请看this
  • "在函数调用中,参数总是从右边推入堆栈。"谁告诉你这是一个对你撒谎的坏人,而你因为相信了他们而上当受骗。 C 不保证堆栈存在,更不用说在其上传递参数,更不用说以某种特定顺序,更不用说它们会按照它们被压入的顺序进行评估可能不存在的堆栈。

标签: c post-increment pre-increment


【解决方案1】:
add(i++,--i);

这是未定义的行为:未指定函数调用参数的求值顺序,这意味着未指定是先求值还是交错求值 i++--i

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

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

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

【讨论】:

  • 可能值得一提的是,函数调用中的 ',' 运算符不会引入序列点
  • @bolov: 你添加的链接是c++而不是c,链接说它不适用于c
  • @shalnic:C99,第 6.5 节,第 2 段:“如果标量对象的副作用相对于同一标量对象的不同副作用或使用相同标量对象的值,行为未定义。”。函数调用中的, 不会强制i++--i 之前被评估;它们相对于彼此未排序,两者都对同一个标量对象产生副作用,因此是UB。
猜你喜欢
  • 2014-07-18
  • 2021-10-29
  • 2016-03-06
  • 2015-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-02
  • 1970-01-01
相关资源
最近更新 更多