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

Math-like chaining of the comparison operator - as in, "if ( (5<j<=1) )"

本文关键字:lt 运算符 链接 比较 if      更新时间:2023-10-16
int j=42;
if( (5<j<=1) ) {
    printf("yes");
} else {
    printf("no");
}

输出:

yes

为什么它输出是?
这个条件不是只有一半正确吗?

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

if(1<j<=5)

不是按照你的期望和想要来解释的;它应该是

if (1 < j && j <= 5)

或类似。

如其他答案中所述,表达式的计算为

 ((1 < j) <= 5)
 =>  ("true" <= 5)
 =>  "true"
其中"true"(

布尔值)隐式转换为 1,例如 explaneid,这里也引用了标准,这解释了为什么"true"必须"小于"5(尽管在 C 中谈论"从布尔值到 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,则此表达式(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 为真)。这是一个真实的表达。您的程序输出"是"。

在所有情况下,程序都输出"yes",因为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");被处决