所以我在C语言中遇到了以下代码
foo() {
int v=10;
printf("%d %d %d\n", v==10, v=25, v > 20);
}
然后返回0 25 0
任何人都可以解释我是如何以及为什么
答案 0 :(得分:3)
printf("%d %d %d\n", v==10, v=25, v > 20);
您所看到的是未定义的行为,因为未定义printf()
内的evalutaion的顺序。
输出可以解释为(从右到左评估)
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
答案 1 :(得分:0)
从右到左评估...
首先,它评估v > 20
的错误,以便打印0
接下来设置v=25
打印
接下来检查是否v is 10
。它是假的,所以它打印0(v
的值在上面的步骤中改变了)
修改强>
这是编译器评估它的方式,但是evalaution的顺序通常是未定义的
答案 2 :(得分:0)
您的代码受到未定义的行为的影响。看起来像在你的平台上,
首先评估 v > 20
,然后是
v=25
,然后是
v==10
。
这完全符合标准的行为。
请记住,这些表达式可以按任何顺序进行评估,但它仍然是符合标准的行为。
答案 3 :(得分:0)
您的编译器似乎从右到左评估函数参数。
因此,首先评估v > 20
,然后评估v=25
,然后评估v==10
。
因此,您获得了输出0 25 0