后递增总是在函数调用之前完成吗?

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
  1. 在计算所有函数参数和函数指示符之后、实际函数调用之前有一个序列点。
  2. \n
\n
\n

这保证g++了完成,包括g在调用函数之前递增。

\n

所以,是的,结果7是有保证且明确的。

\n

更新:C17 标准在 \xc2\xa76.5.2.2-10 的第一句中直接说明了这一点:

\n
\n

在函数指示符和实际参数的计算之后、但在实际调用之前有一个序列点。调用函数(包括其他函数调用)中的每个计算\n在被调用函数体执行之前或之后没有特别排序的\n相对于被调用函数的执行是不确定地排序的

\n
\n

  • 可能值得注意的是,尽管与特定问题无关,但关于被调用函数的执行“不确定排序”的操作将要么在函数执行之前完全排序,要么完全在函数执行之后排序。 (3认同)