三元运算符的不寻常行为?

时间:2012-01-20 14:54:46

标签: c ternary-operator

我今天刚刚和我的c级三元运算符一起玩。并发现了这种奇怪的行为。

#include <stdio.h>
#include <stdbool.h>
main()
{
        int x='0' ? 1 : 2;
        printf("%i",x);
}

returns 1正如所料。但

#include <stdio.h>
#include <stdbool.h>
main()
{
        int x='0'==true ? 1 : 2;
        printf("%i",x);
}

returns 2我希望它return 1

6 个答案:

答案 0 :(得分:2)

'0'的值不为零,它是对系统上的数字'0'进行编码的任何整数值。通常为48(在from ASCII的编码中),当解释为整数时,它不等于true

所以你的第一个代码行等同于

int x = (48 != 0) ? 1 : 2;

明确评估为1。第二个是

int x = (48 == 1) ? 1 : 2;

同样明确地评估为2

答案 1 :(得分:1)

那是因为(假设ASCII)'0'代表整数0x30,即48,而true代表整数1。所以他们不平等。

在C中,任何非零值都被视为true,但true本身为11是您从任何内置布尔测试中获得的值(例如,0 == 0 1}}是1)。

答案 2 :(得分:1)

也许您会混淆'\0''0'

字符常量的值

'\0'
C中

总是0

字符常量的值

'0'

是实现定义的,取决于字符集。对于ASCII,它是0x30

另请注意,宏true定义为值1而非0

答案 3 :(得分:0)

true定义为1. '0'在ASCII中为0x30,不等于1.

因此条件'0'==true不正确。

答案 4 :(得分:0)

那是因为'0' != true。布尔值被提升为整数类型并且等于1,而'0'等于48

答案 5 :(得分:0)

'0'不等于true,因此'0'==true的结果为0(false)。这被分配给x并传递给三元运算符,给出您看到的结果。

如果您打算使用其他内容,则应使用括号来阐明所需的优先顺序,或将代码分解为多个语句。