Трехстороннее сравнение идентичных значений Objective-C приводит к НЕТ - почему?

Учитывая, что все три переменные имеют одинаковые значения, можно ожидать, что следующее сравнение даст ДА:

NSUInteger count1 = 2;
NSUInteger count2 = 2;
NSUInteger count3 = 2;
BOOL countEqual = (count1 == count2 == count3);
// but: countEqual = NO

Увы, countEqual НЕТ, и я хотел бы лучше понять, почему и появляется ли эта конкретная проблема в коде C или C++?

Я предполагаю:

(count1 == count2) --> YES (1)
(YES == count3) or (1 == count3) --> NO (0)

person LearnCocos2D    schedule 09.12.2011    source источник
comment
Это соревнование по скоропечатанию :)   -  person Sergey Kalinichenko    schedule 09.12.2011
comment
РЖУ НЕ МОГУ! Должен быть значок Lucky Luke за ответ на вопрос в течение 10 секунд после его публикации! :)   -  person LearnCocos2D    schedule 09.12.2011


Ответы (4)


Другие авторы уже дали ответ, поэтому я просто процитирую соответствующую часть спецификации, которая его подтверждает:

Операторы == (равно) и != (не равно) аналогичны операторам отношения, за исключением их более низкого приоритета. Каждый из операторов возвращает 1, если указанное отношение истинно, и 0, если оно ложно.

Равенство ассоциативно слева, поэтому оно интерпретируется как:

count1 == count2 == count3
(count1 == count2) == count3
(1) == count3
0
person Tony    schedule 09.12.2011

Ваша догадка совершенно верна, она возьмет результат первого сравнения и сравнит его с третьим значением. Для этого вам нужно будет сделать

countEqual = (count1 == count2) && (count1 == count3);

person Joshua Weinberg    schedule 09.12.2011

Операторы сравнения, такие как ==, не работают так в C и других C-подобных языках.

Сдача:

BOOL countEqual = (count1 == count2 == count3);

to:

BOOL countEqual = (count1 == count2 && count2 == count3);
person Paul R    schedule 09.12.2011

Вы угадываете правильно. Результат первого сравнения сравнивается с третьим значением. Это не то, что вы хотите здесь.

person Stefan Paul Noack    schedule 09.12.2011