C语言 后增量总是在函数调用之前完成吗?

vnzz0bqm  于 2023-06-21  发布在  其他
关注(0)|答案(1)|浏览(66)

考虑以下代码:

#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,并且没有显示任何警告。但这并不意味着它必须是这样的。

46scxncf

46scxncf1#

here所述:
1.在所有函数参数和函数指示符的求值之后,在实际函数调用之前,存在一个序列点。
这保证了g++完成,包括在调用函数之前递增g
所以,是的,结果7是有保证的,并且定义良好。

更新:C17标准在§6.5.2.2-10的第一句中直接说明了这一点:

在函数指示符和实际参数的计算之后,但在实际调用之前,有一个序列点。调用函数(包括其他函数调用)中的每个求值,如果没有在被调用函数体的执行之前或之后明确排序,则相对于被调用函数的执行不确定地排序

相关问题