C 作为printf参数的条件表达式

C 作为printf参数的条件表达式,c,syntax,C,Syntax,所以我在C语言中遇到了以下代码 foo() { int v=10; printf("%d %d %d\n", v==10, v=25, v > 20); } 然后返回0250 谁能解释一下它是如何从右向左评估的,以及为什么从右向左评估的 首先,它计算v>20其值为false,因此它打印0 接下来,它设置v=25并打印它 接下来检查v是否为10。它为false,因此打印0(在上述步骤中更改了v的值) 编辑 这是编译器对其求值的方式,

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

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

谁能解释一下它是如何从右向左评估的,以及为什么从右向左评估的

首先,它计算
v>20
其值为false,因此它打印
0

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

接下来检查
v是否为10
。它为false,因此打印0(在上述步骤中更改了
v
的值)

编辑

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

printf("%d %d %d\n", v==10, v=25, v > 20);
您看到的是未定义的行为,因为未定义
printf()
中的求值顺序

输出可以解释为(从右到左的评估)

那你有


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

您的代码受到未定义行为的影响。看起来在你的平台上

v>20
首先得到评估,然后是
v=25
,后跟
v==10

这是完全符合标准的行为


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

您的编译器似乎从右向左求值函数参数

因此,首先计算
v>20
,然后计算
v=25
,然后计算
v==10


因此,您将获得输出
0250

,除非我遗漏了一些明显的内容,否则我看不到两个求值之间的序列点。这不就是未定义的行为吗?@tangrs,这是未定义的行为。我试图解释OP报告的结果。你可能应该在最后一句话中指出这一点,因为这可能会产生误导。这似乎意味着函数参数求值有一个定义的顺序,我认为C中的情况不是这样。阅读本文可能有重复
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