如果((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"); 得到执行