C 作为printf参数的条件表达式
所以我在C语言中遇到了以下代码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的值) 编辑 这是编译器对其求值的方式,
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