В 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
}
Кажется, это работает нормально, но я никогда не слышал об этом раньше, с < Икс < upper «. Производит ли это исполняемый код так, как вы ожидаете? IE, эквивалентно ли (A) (B)?
Я думаю, что многие люди не будут знать об этом, и я подозреваю, что это может быть потому, что компилятор интерпретирует (A) иначе, чем (B). Это правильно?
Нет, а и б не эквивалентно, вы не можете сделать это.
Или, очевидно, вы Можно (как вы обнаружили), но вы делаете не то, что думаете.
Вы оцениваете (lower < x) < upper
т.е. значение lower < x
(который false
или же true
, но которые конвертировать в int
для сравнения) сравнивается с upper
,
Увидеть эта таблица приоритетов операторов для дополнительной информации.
Они определенно не эквивалентны. Ваше выражение lower < x < upper
сначала оценим lower < x
либо правда или ложь, а затем сделать true < x
или же false < x
соответственно.
Это не работает нормально. На самом деле, это совершенно неправильно, и работает только случайно.
lower < x < upper
анализируется как (lower < x) < upper
; (lower < x)
имеет тип bool
и его значение либо true
или же false
в зависимости от стоимости x
, Чтобы сравнить это bool
значение для upper
компилятор конвертирует bool в число с плавающей запятой со значением 1.0
за true
а также 0.0
за false
,
Ну да. В любом случае x
находится между диапазоном значений.
Например:
ниже = 4;
верхний = 9;
х = 7;
Если вы делаете: 7 > 4 && 7 < 9
это то же самое, что сказать 4 < 7 < 9
,
Это базовая арифметика, кстати.