条件表达式作为 printf 的参数

Conditional expressions as arguments to printf

所以我在 C 语言中遇到了以下代码

foo() {                     
    int v=10;
    printf("%d %d %d\n", v==10, v=25, v > 20);
}

它returns 0 25 0 任何人都可以向我解释如何以及为什么

从右到左求值...

首先它计算 v > 20 为假所以它打印 0

接下来设置 v=25 并打印它

接下来检查是否 v is 10。它是假的,所以它打印 0(v 的值在上面的步骤中被更改)

编辑

这是您的编译器对其求值的方式,但求值顺序通常是未定义的

printf("%d %d %d\n", v==10, v=25, v > 20);

您看到的是未定义的行为,因为 printf() 中的求值顺序未定义。

输出可以解释为(从右到左求值)

v = 10 and hence v>20 is false so last `%d` prints 0
v = 25 Now v is 25 so second `printf()` prints out 25

那么你有

v ==10 这是错误的,因为 v 现在是 25。这不是定义的评估顺序,可能会有所不同,因此这是 UB

您的代码存在未定义行为。看起来在你的平台上,

v > 20 先被评估,然后是
v=25,接着是
v==10.

这是完全符合标准的行为。

请记住,这些表达式可以按任何顺序求值,并且它仍然是符合标准的行为。

您的编译器似乎是从右到左计算函数参数的。

因此,首先评估 v > 20,然后是 v=25,然后是 v==10

因此你得到输出 0 25 0