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; }