Почему комбинированное сравнение верхней и нижней границ всегда дает истину?

Почему первый всегда оценивается как истина? Я ожидаю, что эти два утверждения будут вести себя одинаково.

   for (int i =0;i<4;++i) (0 < i < 3) ? cout << "True " : cout << "False ";

Правда Правда Правда Правда

    for (int i =0;i<4;++i) (0 < i && i < 3) ? cout << "True " : cout << "False ";

Неверно Верно Верно Ложно


person Ben    schedule 25.09.2018    source источник
comment
(0 < i < 3) -- Вскоре вы обнаружите, что C++ — это не алгебра.   -  person PaulMcKenzie    schedule 25.09.2018
comment
не путайте математическую нотацию с синтаксисом C++, есть сходство (например, выражение типа 0 < i либо истинно, либо ложно), но различия перевешивают их. Возможно, наиболее ярким примером является x = 3*y;, которое является не уравнением, а присваиванием.   -  person 463035818_is_not_a_number    schedule 25.09.2018


Ответы (2)


Состояние 0 < i < 3 на самом деле (0 < i) < 3.

И не имеет значения, истинно 0 < i или нет, поскольку результат (0 для ложного и 1 для истинного) всегда будет меньше 3.

Если вы хотите убедиться, что i находится в диапазоне, вам нужно несколько отдельных сравнений: 0 < i && i < 3, как вы делаете во втором цикле.

person Some programmer dude    schedule 25.09.2018

Потому что в C++ не существует комбинированного оператора сравнения. Выражение оценивается как

(0 < i) < 3

но x < 1 оценивается как true/false, что оценивается как 1/0 по сравнению с int, поэтому в конце концов 0 < 3 всегда верно, и 1 < 3 тоже.

person Jack    schedule 25.09.2018