我今天刚刚和我的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
。
答案 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
本身为1
,1
是您从任何内置布尔测试中获得的值(例如,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
并传递给三元运算符,给出您看到的结果。
如果您打算使用其他内容,则应使用括号来阐明所需的优先顺序,或将代码分解为多个语句。