Обратите внимание, что оригинальная версия совершенно легальна; он просто не делает то, что вы (разумно) думаете, что делает. Вам повезло, что компилятор признал это вероятной ошибкой и предупредил вас об этом.
Оператор <
ассоциируется слева направо, как и оператор +
. Так как a + b + c
действительно означает (a + b) + c
, a < b < c
действительно означает (a < b) < c
. Оператор <
возвращает значение int 0, если условие ложно, и 1, если оно истинно. Таким образом, вы либо проверяете, меньше ли 0, чем c, либо 1 меньше, чем c.
В маловероятном случае, если это действительно то, что вы хотите сделать, добавление скобок, вероятно, отключит предупреждение. Любой, кто читает ваш код позже, также заверит вас в том, что вы знаете, что делаете, поэтому они не «исправят» это. (Опять же, это применимо только в том маловероятном случае, когда вы действительно захотите (a < b) < c)
.)
Способ проверки, является ли a
меньше b
и b
меньше c
:
a < b && b < c