为什么我的程序从右到左评估参数?

San*_*ede 6 c function-call order-of-execution

我正在学习C,因此尝试了以下代码,并获得了7,6而不是的输出6,7。为什么?

#include <stdio.h>
int f1(int);
void main()
{
    int b = 5;
    printf("%d,%d", f1(b), f1(b));
}
int f1(int b)
{
    static int n = 5;
    n++;
    return n;
}
Run Code Online (Sandbox Code Playgroud)

Bat*_*eba 12

函数参数的求值顺序在C中未指定(请注意,这里没有未定义的行为;例如,不允许同时对参数求值。)

通常,对参数的求值是从右到左或从左到右。

根据经验,如果该函数有副作用(如您的情况),或者如果您两次传递相同的参数(允许您在调用站点中进行某些操作),则不要在函数参数列表中两次调用相同的函数被修改(例如传递一个指针)。

  • @ Nico238“ 3.4.4 ** 1未指定的行为**使用未指定的值,或在本国际标准提供两种或多种可能性且在任何情况下都不对所选择的内容施加任何其他要求的其他行为。** 2示例**未指定行为的一个示例是对函数的参数进行评估的顺序。” 与“ 3.4.3 ** 1未定义行为**”不同。 (8认同)
  • @ Nico238:C标准明确定义了“未定义的行为”,以表示该标准对其施加“无”要求的行为。如果在某些情况下,该行为施加了部分而非全部要求,例如要求以任何顺序单独执行评估(根本不进行交错评估),那么按标准定义,这不是未定义的行为。 (3认同)
  • @ Nico238未定义行为和未指定行为都是形式术语,它们是不同的。[未定义,未指定和实现定义的行为](/sf/ask/167858911/) (3认同)