我有一个名为的全局变量var
和一个函数foo
。(我知道这是一种不好的做法,但有时这是不可避免的)我想知道 C 标准(我正在使用 c99 编译)是否说明var
如果我尝试执行会发生什么:
long foo(){
return var++;
}
谢谢。
我有一个名为的全局变量var
和一个函数foo
。(我知道这是一种不好的做法,但有时这是不可避免的)我想知道 C 标准(我正在使用 c99 编译)是否说明var
如果我尝试执行会发生什么:
long foo(){
return var++;
}
谢谢。
简短的回答:
它将返回一个副本,var
然后立即递增 global var
。
长答案:
C11 6.5.2.4
“后缀 ++ 运算符的结果是操作数的值。作为副作用,操作数对象的值增加了......”。/--/ 结果的值计算在更新操作数的存储值的副作用之前排序。
标准 5.1.2.3“程序执行”规定必须在程序遇到序列点之前评估所有副作用。(大量关于序列点可以在这里找到)。
语句后有一个序列点return
(C11 6.8/4)。
这意味着var++
在 main() 中的任何代码继续之前,保证表达式被完全评估。
您的机器代码将如下所示的伪代码:
var
在堆栈上(或寄存器等)var
1。var
”。如果您改为使用前缀增量,则增量操作将在存储副本之前进行排序。
作为var++
一个后增量,它基本上是这样的:
long foo(){
long tmp = var;
var++;
return tmp;
}
如果您++var
改为使用,它将返回增加的值(因为它会在返回值之前增加变量)。
foo()
将返回 的当前值var
,并var
增加。