后置自增是否必定先于函数调用执行?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
相关产品推荐
相关产品推荐

