Objective C MAX макро ошибка - PullRequest
       7

Objective C MAX макро ошибка

9 голосов
/ 24 сентября 2010

Я вижу странное поведение с макросом MAX в Objective C. В частности, у меня есть этот код в моей основной функции:

NSArray* array = [NSArray array];
NSLog(@"[array count] - 1 = %d", [array count] - 1);
NSLog(@"MAX(0, [array count] - 1) = %d", MAX(0, [array count] - 1));
NSLog(@"MAX(0, -1) = %d", MAX(0, -1));

Вывод:

[array count] - 1 = -1
MAX(0, [array count] - 1) = -1
MAX(0, -1) = 0

Я сохранил вывод препроцессора с -save-temps, и это выглядит так:

NSArray* array = [NSArray array];
NSLog(@"[array count] - 1 = %d", [array count] - 1);
NSLog(@"MAX(0, [array count] - 1) = %d", ((0) > ([array count] - 1) ? (0) : ([array count] - 1)));
NSLog(@"MAX(0, -1) = %d", ((0) > (-1) ? (0) : (-1)));

Есть все необходимые скобки, и [array count] - 1 не имеет побочных эффектов, поэтому обычные проблемы с макросами не должны применяться. Есть идеи, что происходит?

1 Ответ

23 голосов
/ 24 сентября 2010

[array count] возвращает NSUInteger - другими словами, целое число без знака. Таким образом, [array count] - 1 не равно -1, это ((NSUInteger) -1), что равно 0xFFFFFFFF или что-то в этом роде, что больше нуля.

Но затем, когда вы берете 0xFFFFFFFF и передаете его в качестве аргумента NSLog(@"%d"), NSLog обрабатывает его как целое число со знаком (поскольку вы использовали% d).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...