Заметьте, это сформулировано так, как оно было объединено с этого вопроса .ОП спросил, почему a==b==c
эквивалентно a==b && b==c
в Задаче C (которая является строгим надмножеством C).Я попросил, чтобы этот ответ был перенесен, так как он ссылается на спецификацию, где другие ответы здесь не нужны.
Нет, это не так, это похоже на (a==b) == c
.
Давайте посмотрим напростой контрпример к вашему правилу:
(0 == 0 == 0);// evaluates to 0
Однако
(0 == 0) && (0 == 0) // evaluates to 1
Логика проблематична, поскольку:
(0 == 0 == 0)
считывается как ((0 == 0) == 0)
, что аналогичнона 1 == 0
, что неверно (0).
Для амбициозного студента
Небольшое погружение в то, как это оценивается.Языки программирования включают грамматику , которая определяет, как вы читаете утверждение на языке.У Siance Objective-C нет фактической спецификации. Я буду использовать спецификацию C, поскольку target-c является строгим расширенным набором c.
Стандарт гласит, что equality expression
(6.5.9) оценивается какследующее:
Выражение равенства:
выражение отношения
выражение равенства == выражение отношения
Выражение равенства! = выражение отношения
Наш случай - второй, поскольку в a == b == c
читается как equality_expression == relational_expression
, где первое выражение равенства - a == b
.
(Теперь фактический номер результата следует довольно далеко от буквального числа: равенство-> реляционный-> сдвиг-> аддитивный-> мультипликативный-> приведение-> унарный-> постфикс-> основной->постоянный, но не в этом суть)
Таким образом, спецификация четко заявляет , что a==b==c
делает не оценивается так же, как a==b && b==c
Стоит отметить, что некоторые языки поддерживают выражения в форме a<b<c
, однако C не является одним из таких языков.