考虑以下代码:
#include <stdio.h>
static int g=3;
static int foo(int a)
{
return g+a;
}
int main(void)
{
printf("%i\n",foo(g++));
}
输出是否总是7(假设printf()
不会失败)?也就是说,标准是否保证foo()
的参数列表中的表达式g++
在输入foo()
之前执行?或者,编译器是否可能设置g=3
使用g==3
调用foo()
,并在foo()
执行完成后递增g
(并输出6
而不是7
)?
我测试的所有编译器(版本)都打印7
,并且没有显示任何警告。但这并不意味着它必须是这样的。
1条答案
按热度按时间46scxncf1#
如here所述:
1.在所有函数参数和函数指示符的求值之后,在实际函数调用之前,存在一个序列点。
这保证了
g++
完成,包括在调用函数之前递增g
。所以,是的,结果
7
是有保证的,并且定义良好。更新:C17标准在§6.5.2.2-10的第一句中直接说明了这一点:
在函数指示符和实际参数的计算之后,但在实际调用之前,有一个序列点。调用函数(包括其他函数调用)中的每个求值,如果没有在被调用函数体的执行之前或之后明确排序,则相对于被调用函数的执行不确定地排序