比较运算符的类似数学的链接 - 如,“if((5

时间:2014-01-08 07:31:36

标签: c++ c if-statement comparison-operators

int j=42;
if( (5<j<=1) ) {
    printf("yes");
} else {
    printf("no");
}

输出:

yes

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

4 个答案:

答案 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)

As per operator precedence和LR关联性,

1<j评估为1

1<=5评估为1

if(1)
{ 
  printf("yes")

答案 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");可以获得