比较运算符的类似数学的链接 - 例如,"if((5 <j <= 1))"

Men*_*han 0 c c++ if-statement comparison-operators

int j=42;
if( (5<j<=1) ) {
    printf("yes");
} else {
    printf("no");
}
Run Code Online (Sandbox Code Playgroud)

输出:

yes
Run Code Online (Sandbox Code Playgroud)

为什么输出是?
不是条件只有一半是真的吗?

Shi*_*zou 7

C不理解类似数学的语法,所以

if(1<j<=5)
Run Code Online (Sandbox Code Playgroud)

没有被解释为你期望和想要的; 它应该是

if (1 < j && j <= 5)
Run Code Online (Sandbox Code Playgroud)

或类似的.

如在其他答案中所解释的,表达式被评估为

 ((1 < j) <= 5)

 =>  ("true" <= 5)

 =>  "true"
Run Code Online (Sandbox Code Playgroud)

其中"true"(布尔值)被隐式转换为1,例如这里的解释,也引用了标准,这解释了为什么"true"必须"小于"5(尽管在C中可能不完全正确)谈论"从bool到int的隐式转换"

  • @Ashish:从布尔表达式到int的隐式转换 (2认同)

Suv*_*yil 6

根据运算符优先级和LR关联性,

1<j 评估为1

1<=5 评估为1

if(1)
{ 
  printf("yes")
Run Code Online (Sandbox Code Playgroud)


小智 5

你的问题有点破,但我相信以下内容将澄清你的情况:

在C中,1 < j <= 5意思是相同的(1 < j) <= 5.并且值为1 < j0或1取决于是小于还是等于1或严格大于1.所以这里是代码中j的一些值会发生的情况:

如果j == 0,这个表达式是(1 < 0) <= 5,减少到0 <= 5(因为1 < 0是假的).这是一个真实的表达.你的程序输出"是".

如果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.