2010-09-24 7 views
9

Je vois un comportement étrange avec la macro MAX en Objective C. Plus précisément, j'ai ce code dans ma fonction principale:Objectif C MAX bug macro

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)); 

La sortie est:

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

J'ai sauvé la sortie de préprocesseur avec -save-temps, et il ressemble à ceci:

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))); 

Toutes les parenthèses nécessaires sont là , et [array count] - 1 n'a pas d'effets secondaires, donc les problèmes de macro habituels ne devraient pas s'appliquer. Une idée de ce qui se passe?

Répondre

23

[array count] renvoie NSUInteger - en d'autres termes, un entier non signé. Donc [array count] - 1 n'est pas -1, c'est ((NSUInteger) -1), qui est 0xFFFFFFFF ou quelque chose comme ça - qui est supérieur à zéro. Mais quand vous prenez 0xFFFFFFFF et le passez comme argument à NSLog(@"%d"), NSLog le traite comme un entier signé (parce que vous avez utilisé% d).

+0

Je n'ai pas remarqué que la valeur de retour était non signée, mais cela a du sens. Merci! –