Вы должны рассмотреть, как оно оценивается ...
a == b == c
спрашивает, равны ли два из них (a
и b
), затем сравнивает этот логический результат с третьим значением c
!Это НЕ сравнивает первые два значения с третьим.Все, что находится за пределами двух аргументов, не будет цепляться, как вы, очевидно, ожидаете.
Сколько бы это ни стоило, поскольку C ++ считает ненулевые значения «истинными» в логическом контексте, вы можете выразить то, что хотите, просто:
return year && month && day && hour && minute && second;
(примечание: ваш пересмотренный код дважды говорит "месяц" и не проверяет минуты).
Назад к цепочке ==
s: с пользовательскими типами и операторомперегрузка может создать класс, который сравнивается, как вы ожидаете (и он даже может позволить вещам вроде 0 <= x < 10
«работать» так, как это читается в математике), но создание чего-то особенного просто запутает других программистовкто уже знает (странный) способ, которым эти вещи работают для встроенных типов в C ++.Тем не менее, стоит выполнить упражнение по программированию на десять / двадцать минут, если вы заинтересованы в глубоком изучении C ++ (подсказка: вам нужны операторы сравнения, чтобы вернуть прокси-объект, который запоминает значение слева для следующего сравнения).оператор).
Наконец, иногда эти «странные» логические выражения полезны: например, a == b == (c == d)
может быть выражено на английском языке как «либо (a == b) и (c == d), либо ИЛИ(a! = b) и (c! = d) ", или, возможно," эквивалентность a и b такая же, как эквивалентность c и d (независимо от того, имеет ли значение true или false) ".Это может моделировать ситуации реального мира, такие как сценарий двойного знакомства: если a любит / не любит b (их дата) столько же, сколько c любит / не любит d, то они либо будут торчать и хорошо проводить время, либо назовут это быстро ив любом случае это безболезненно ... иначе у одной пары будет очень утомительное время .... Поскольку эти вещи могут иметь смысл, компилятор не может знать, что вы не собирались создавать такое выражение.