Равенства в C / Stack Overflow

В 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). Это правильно?

2

Решение

Нет, а и б не эквивалентно, вы не можете сделать это.

Или, очевидно, вы Можно (как вы обнаружили), но вы делаете не то, что думаете.

Вы оцениваете (lower < x) < upperт.е. значение lower < x (который false или же true, но которые конвертировать в int для сравнения) сравнивается с upper,

Увидеть эта таблица приоритетов операторов для дополнительной информации.

13

Другие решения

Они определенно не эквивалентны. Ваше выражение lower < x < upper сначала оценим lower < x либо правда или ложь, а затем сделать true < x или же false < x соответственно.

3

Это не работает нормально. На самом деле, это совершенно неправильно, и работает только случайно.

lower < x < upper анализируется как (lower < x) < upper; (lower < x) имеет тип boolи его значение либо true или же falseв зависимости от стоимости x, Чтобы сравнить это bool значение для upper компилятор конвертирует bool в число с плавающей запятой со значением 1.0 за true а также 0.0 за false,

1

Ну да. В любом случае x находится между диапазоном значений.
Например:
ниже = 4;
верхний = 9;
х = 7;

Если вы делаете: 7 > 4 && 7 < 9 это то же самое, что сказать 4 < 7 < 9,
Это базовая арифметика, кстати.

-3
По вопросам рекламы [email protected]