在C ++中,确定某个值x是否介于两个限制之间的常用方法是:
//This is (A)
double x = 0.0d;
double lower = -1.0d;
double upper = +1.0d;
if(x > lower && x < upper){
// Do some stuff
}
但是今天我偶然发现我能做到这一点:
// This is (B)
double x = 0.0d;
double lower = -1.0d;
double upper = +1.0d;
if(lower < x < upper){
// Do some stuff
}
它似乎工作得很好,但我从来没有听说过这种做法,“较低的&lt; x&lt; upper”。这是否会产生您所期望的可执行代码? IE,是(A)相当于(B)?
我想很多人都不会知道这一点,我怀疑这可能是因为编译器(A)对(B)的解释不同。这是对的吗?
答案 0 :(得分:13)
不,A和B 不等于,你不能这样做。
或者,显然你可以(正如你发现的那样),但你没有做你认为你正在做的事情。
您正在评估(lower < x) < upper
,即lower < x
的值(false
或true
,但转换为int
进行比较)与upper
进行比较。
有关详细信息,请参阅this table of operator precedence。
答案 1 :(得分:3)
他们肯定不等同。您的表达式lower < x < upper
将首先将lower < x
评估为真或假,然后分别执行true < x
或false < x
。
答案 2 :(得分:1)
它不能正常工作。事实上,这是错误的,只是偶然的。
lower < x < upper
被解析为(lower < x) < upper
; (lower < x)
的类型为bool
,其值为true
或false
,具体取决于x
的值。要将bool
值与upper
进行比较,编译器会将bool转换为浮点数,1.0
的值为true
,0.0
的值为false
。
答案 3 :(得分:-3)
嗯,是的。在任何一种情况下,x
都在值范围之间。
例如:
lower = 4;
upper = 9;
x = 7;
如果您这样做:7 > 4 && 7 < 9
与说4 < 7 < 9
相同。
顺便说一句,这是基本的算术。