我认为此语法0 < x < 10
与此语法0 < x && x < 10
相同。但是,今天,我的计划证明我错了。通常情况下,我不会问这类问题,0 < x < 10
做了什么?但编译器接受了它,所以我希望它有某种功能。
以下是我的代码的一部分:
if (0 <= grade < 59)
letter = 'F';
else if (60 <= grade < 69)
letter = 'D';
else if (70 <= grade < 79)
letter = 'C';
else if (80 <= grade < 89)
letter = 'B';
else if (90 <= grade <= 100)
letter = 'A';
else
letter = '?';
结果总是返回letter ='F'
,所以我认为编译器只将0 <= grade
视为条件。但是,当我指定char值或负数时,如果编译器工作的方式比letter
应该等于?
。但事实并非如此。所以我真的很困惑编译器的错误和'编译器的功能',因为如果它是那么0 < x < 10
做什么?
答案 0 :(得分:5)
所以基本上,你需要检查的是运算符优先级和关联性。
基于优先级(L - > R)和关联性的 (0 < x < 10)
可以分解为:
(0 < x)
产生bool
类型
然后,bool < 10 (int)
总是 true
一个重要的注意事项是,由于bool
值为0
或1
,编译器会希望将其推导为int
,如:
int grade = 10;
std::cout << (0 < grade < 0); // false
std::cout << (0 < grade < 1); // false
std::cout << (0 < grade < 2); // true
typeid((0 < grade)).name(); // b