124*_*123 18 c language-lawyer
考虑这段代码:
#include <stdio.h>
static int g=3;
static int foo(int a)
{
return g+a;
}
int main(void)
{
printf("%i\n",foo(g++));
}
Run Code Online (Sandbox Code Playgroud)
输出总是7(假设printf()不会失败)?意思是,标准是否保证g++参数列表中的表达式在输入foo()之前执行?foo()或者编译器是否有可能在执行完成后设置g=3调用foo()并g==3递增(并输出而不是输出)?gfoo()67
我测试打印的所有编译器(版本)都7没有显示任何警告。但这并不意味着事情必须如此。
nie*_*sen 19
正如这里所述:
\n\n\n\n
\n- 在计算所有函数参数和函数指示符之后、实际函数调用之前有一个序列点。
\n
这保证g++了完成,包括g在调用函数之前递增。
所以,是的,结果7是有保证且明确的。
更新:C17 标准在 \xc2\xa76.5.2.2-10 的第一句中直接说明了这一点:
\n\n\n在函数指示符和实际参数的计算之后、但在实际调用之前有一个序列点。调用函数(包括其他函数调用)中的每个计算\n在被调用函数体执行之前或之后没有特别排序的\n相对于被调用函数的执行是不确定地排序的
\n