You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

后置自增是否必定先于函数调用执行?C语言代码输出是否有标准保证?

关于C语言函数调用中实参求值与函数执行顺序的问题

请看以下代码:

#include <stdio.h>
static int g=3;

static int foo(int a)
{ 
  return g+a; 
}

int main(void)
{
  printf("%i\n",foo(g++));
}

假设printf()执行成功,输出是否一定为7?也就是说,C语言标准是否保证foo()实参列表中的表达式g++会在进入foo()前执行?还是编译器可能先以g=3调用foo(),待foo()执行完成后再对g执行自增操作,从而输出6?

我测试过的所有编译器版本都输出7且未给出任何警告,但这并不代表情况必定如此。


输出一定是7,不存在输出6的可能。

根据C语言标准的规定,函数调用过程中,所有实参表达式的求值(包括表达式带来的副作用,比如这里的g++自增操作)必须在函数执行的入口点之前全部完成。

具体到这段代码:

  • 调用foo(g++)时,首先会对实参g++求值:先取g当前的值3作为传递给foo的参数a,然后立即将g自增为4;
  • 完成实参求值后,才会进入foo函数执行,此时g的值已经是4,a的值是3,所以foo返回4+3=7;
  • 最后printf输出7。

你测试的编译器都输出7,是因为它们都严格遵循了C语言标准的要求,这种行为是标准强制规定的,不存在编译器可以自由调整顺序的空间。

内容的提问来源于stack exchange,提问作者12431234123412341234123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 02:12:39