条件表达式作为printf的参数

时间:2015-01-31 06:33:11

标签: c syntax

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

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

然后返回0 25 0 任何人都可以解释我是如何以及为什么

4 个答案:

答案 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