C中的A> = B> = C运算符?

考虑:

#include int main() { if (2 >= 1 >= 1) printf("1\n"); if (200 >= 100 >= 100) printf("2\n"); return 0; } 

nyc @ nyc:〜/ PRG $ gcc sample.c

nyc @ nyc:〜/ PRG $ ./a.out 1

为什么即使第二个表达式的计算结果为TRUE,该程序也只打印1?

C不支持这样的链接运算符。 您必须将该表达式划分为两个,由逻辑AND运算符分隔:

 if(2 >= 1 && 1 >= 1) if(200 >= 100 && 100 >= 100) 

否则,执行为

 if((2 >= 1) >= 1) if((200 >= 100) >= 100) 

并且左边的部分将首先执行,如果该条件为真,将评估为1并且将评估为0,如果它为假,则上述条件变为

 if(1 >= 1) /* which is true */ if(1 >= 100) /* which is false */ 

第二个表达式不会评估为true。

C标准定义比较运算符(’>’,’> =’,’==’等)以返回int结果,0(对于false)或1(对于true)。 此外, >=从左到右进行评估。 (forms上,这称为运营商的关联性)。

所以2>=1>=1相当于(2>=1)>=1 。 这是1 >= 1 ,其值为1。

200>=100>=100被计算为(200>=100)>=100 ,其中1 >= 100 ,其评估为0。

首先注意2>=1>=1可能是无意义的表达式,它不等于数学区间。 代码的字面意思是:

  • 2>=1 。 如果2大于或等于1,则求值为1(真),否则求值为0(假)。
  • 2>=1>=1 。 如果来自子表达式2>=1的评估值大于或等于1,则评估为1(真),否则评估为0(假)。

要检查某个值是否在给定内部,您必须写if(2>=x && x>=1)


话虽如此,实际评估需要考虑三个不同的事情: 运算符优先级运算符关联性操作数的评估顺序

运算符优先级仅确定不同运算符相对于彼此的优先级。 由于表达式中唯一的运算符是>= ,它们都具有相同的优先级,因为它们都属于同一组运算符:关系运算符。

当在同一表达式中找到具有相同优先级的运算符时,运算符关联性适用。 关系运算符的运算符关联性是从左到右,这意味着如果在同一个表达式中找到两个关系运算符,它们的操作数将从左到右分组,使得此特定表达式等效于(2>=1) >= 1

术语评估顺序在C中使用得相当松散,但通常是指操作数/子表达式的评估顺序,这与运算符优先级完全无关。 考虑a() >= b() >= c() 。 运算符优先级和关联性保证此表达式等效于(a() >= b()) >= c() ,但它不保证运算符的计算顺序。 在这种情况下,运算符优先级/关联性与执行函数的顺序无关 ,而只与其结果的使用顺序无关

在大多数情况下,操作数的评估顺序在C中未指定,这意味着我们无法知道它也不依赖它。 (一些特殊的运算符,如&& || ?:,保证了操作数的评估顺序,大多数运算符没有。)因此,如果评估顺序对结果很重要,我们最好将表达式分成几行。

2>=1>=1的特定情况下,只有整数常量文字,因此评估顺序在这里无关紧要。 但请不要将运算符优先级与评估顺序混淆,它们是不同的东西。

试试这个

 #include int main() { if(2>=(1>=1)) printf("1\n"); if(200>=(100>=100)) printf("2\n"); return 0; }