条件表达式作为 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
所以我在 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