如果((5 <j <1)),
int j=42; if( (5<j<=1) ) { printf("yes"); } else { printf("no"); }
输出:
yes
为什么输出是的?
情况不是只有一半是真的吗?
C不懂math的语法,所以
if(1<j<=5)
不是按照你的期望和要求解释的; 它应该是
if (1 < j && j <= 5)
或类似的。
正如其他答案中所解释的那样,expression式被评估为
((1 < j) <= 5) => ("true" <= 5) => "true"
其中“true”(布尔值)被隐式地转换为1,作为解释,例如在这里也引用标准,这就解释了为什么“true”必须“小于”5(尽pipe在C中可能不完全正确说“从bool到int的隐式转换”)
根据运算符优先级和LR关联性,
1<j
评估为1
1<=5
评估为1
if(1) { printf("yes")
你的问题有点坏了,但是我相信下面的内容会说明你正在做什么:
在C中, 1 < j <= 5
意味着与(1 < j) <= 5
相同的东西。 而1 < j
的值是0或1,取决于是否小于或等于1或严格大于1.所以,这就是在你的代码中的几个j值会发生什么:
如果j == 0
,则这个expression式是(1 < 0) <= 5
,它减less到0 <= 5
(因为1 < 0
是假的)。 这是一个真实的expression。 你的程序输出“是”。
如果j == 3
,这个expression式是(1 < 3) <= 5
,它减less到1 <= 5
(因为1 < 3
是真的)。 这是一个真实的expression。 你的程序输出“是”。
如果j == 6
,则该expression式为(1 < 6) <= 5
,其减less到1 <= 5
(因为1 < 6
为真)。 这是一个真实的expression。 你的程序输出“是”。
在所有的情况下,你的程序输出“是”,因为1 < j
是0或1,并且任何一个都小于5。
你应该使用的是1 < j && j <= 5
。
你要写的是if ( 1 < j && j <= 5 )
你的情况发生了什么: if ( 1 < j <=5 )
1 < j
首先被评估,并且它是真的,所以它被评估为1并且你的条件变成了
if (1 <=5)
,这也是如此printf("yes");
得到执行