int j=42;
if( (5<j<=1) ) {
printf("yes");
} else {
printf("no");
}
输出:
yes
为什么输出是? 条件不是只有一半是真的吗?
答案 0 :(得分:7)
C不懂数学类语法,所以
if(1<j<=5)
未被解释为您所期望和想要的;它应该是
if (1 < j && j <= 5)
或类似。
如其他答案所述,表达式评估为
((1 < j) <= 5)
=> ("true" <= 5)
=> "true"
其中“true”(布尔值)被隐式转换为1,例如,例如here,也引用了标准,这解释了为什么“true”必须“小于”5(尽管在C语言中可能不完全正确地说“从bool到int的隐式转换”)
答案 1 :(得分:6)
答案 2 :(得分:5)
你的问题有点破,但我相信以下内容会澄清你的情况:
在C中,1 < j <= 5
与(1 < j) <= 5
的含义相同。并且1 < j
的值为0或1,具体取决于是小于还是等于1或严格大于1.所以这里是代码中j的一些值会发生的情况:
如果j == 0
,则此表达式为(1 < 0) <= 5
,其缩减为0 <= 5
(因为1 < 0
为false)。这是一个真实的表达。你的程序输出“是”。
如果j == 3
,则此表达式为(1 < 3) <= 5
,其缩减为1 <= 5
(因为1 < 3
为真)。这是一个真实的表达。你的程序输出“是”。
如果j == 6
,则此表达式为(1 < 6) <= 5
,其缩减为1 <= 5
(因为1 < 6
为真)。这是一个真实的表达。你的程序输出“是”。
在所有情况下,您的程序输出“是”,因为1 < j
为0或1,并且两种方式都小于5.
您应该使用的是1 < j && j <= 5
。
答案 3 :(得分:2)
你想写的是
if ( 1 < j && j <= 5 )
您的案例中发生的事情是:if ( 1 < j <=5 )
首先评估1 < j
,并且它是真的,因此它被评估为1并且您的条件变为
if (1 <=5)
,这也是正确的,因此printf("yes");
可以获得