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