Skip to content
On this page

C语言中函数参数执行顺序


标签:clang/basic  

看这样一段代码 :

c
#include <stdio.h>

int main()
{
	int a = 1, b = 2;
	printf("%d, %d\n", a += b, b += a);
	return 0;
}

gcc 编译的运行结果为 4, 3 , clang 编译的运行结果为 3, 5 , 可以发现 在 gcc 中, 代码是从最后一个参数开始执行的, 而 clang 是最左边的.

再来看一段代码:

c
#include <stdio.h>

int main()
{
	int i = 0;
	printf("%d, %d\n", ++i, ++i);
	return 0;
}

这段代码, gcc 编译运行的结果是 2, 2 , clang 编译运行的结果是 1, 2 , 可以发现 在 gcc 中代码是先运行完成, 再进行输出, 而 clang 是边输出边进行计算的.

发生上面这些问题的原因在于 ==C 语言函数调用的参数计算顺序是未定义的==[^1] . 如果函数调用具有副作用,则它可能会对结果产生影响。因此,在编写具有副作用的函数时,需要特别小心,并确保其行为不会受到参数顺序的影响。

[^1]: 参考 : Order of evaluation - cppreference.com

Last updated: