8

我有一个名为的全局变量var和一个函数foo。(我知道这是一种不好的做法,但有时这是不可避免的)我想知道 C 标准(我正在使用 c99 编译)是否说明var如果我尝试执行会发生什么:

long foo(){
    return var++;
}

谢谢。

4

3 回答 3

10

简短的回答:

它将返回一个副本,var然后立即递增 global var

长答案:

C11 6.5.2.4

“后缀 ++ 运算符的结果是操作数的值。作为副作用,操作数对象的值增加了......”。/--/ 结果的值计算在更新操作数的存储值的副作用之前排序。

标准 5.1.2.3“程序执行”规定必须在程序遇到序列点之前评估所有副作用。(大量关于序列点可以在这里找到)。

语句后有一个序列点return(C11 6.8/4)。

这意味着var++在 main() 中的任何代码继续之前,保证表达式被完全评估。

您的机器代码将如下所示的伪代码:

  • 将本地副本存储var在堆栈上(或寄存器等)
  • 将全局增加var1。
  • 从子程序返回。
  • 使用“副本- var”。

如果您改为使用前缀增量,则增量操作将在存储副本之前进行排序。

于 2013-03-25T15:11:22.497 回答
6

作为var++一个后增量,它基本上是这样的:

long foo(){
  long tmp = var;
  var++;
  return tmp;
}

如果您++var改为使用,它将返回增加的值(因为它会在返回值之前增加变量)。

于 2013-03-25T14:41:35.487 回答
2

foo()将返回 的当前值var,并var增加。

于 2013-03-25T14:39:52.480 回答