Трехстороннее сравнение идентичных значений в Objective-C с НЕТ - почему? - PullRequest
2 голосов
/ 09 декабря 2011

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

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)

Ответы [ 4 ]

7 голосов
/ 09 декабря 2011

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

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

4 голосов
/ 09 декабря 2011

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

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

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

count1 == count2 == count3
(count1 == count2) == count3
(1) == count3
0
1 голос
/ 09 декабря 2011

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

Изменение:

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

на:

BOOL countEqual = (count1 == count2 && count2 == count3);
0 голосов
/ 09 декабря 2011

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

...