函数中的求值顺序是按照参数列表的顺序从左到右依次求值。

25 浏览
0 Comments

函数中的求值顺序是按照参数列表的顺序从左到右依次求值。

这个问题已经在这里找到了答案

为什么这些使用前置和后置递增的结构是未定义的行为?

main()
{
    int i=5;
    printf("%d%d%d%d%d%d",i++,i--,++i,--i,i);
}

输出结果是45545,但我不知道它是如何工作的。有人说,在函数调用中的参数会从左向右被压入栈中。

admin 更改状态以发布 2023年5月22日
0
0 Comments

函数参数传递的顺序在标准中并未定义,而是由编译器使用的调用约定决定的。
我认为在您的情况下,使用了cdecl调用约定(许多C编译器用于x86架构),其中函数中的参数从右到左进行评估。

0
0 Comments

函数参数的评估顺序是未指定的。

根据c99标准:

6.5.2.2函数调用

10/函数指示符、实际参数以及实际参数内的子表达式的评估顺序是未指定的,但在实际调用之前有一个顺序点。

然而,这只是问题的一部分。另一件事情(实际上更糟糕,因为它涉及未定义的行为)是:

6.5表达式

2/在前一个序列点和下一个序列点之间,一个对象的存储值应由表达式的评估最多修改一次。此外,先前的值只能读取以确定要存储的值。

在我们的情况下,所有的参数评估都在仅有的2个序列点之间:前一个;和进入函数之前但在所有参数评估之后的点。你最好不要写这样的代码。

C标准在某些地方非常宽松,以留出编译器可能进行的优化的空间。

0