2010-09-24 16 views
9

sto vedendo strano comportamento con la macro MAX in Objective C. In particolare, ho questo codice nel mio funzione principale:Objective C MAX macro bug

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

L'output è:

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

ho salvato l'uscita del preprocessore con -save-temps, e sembra che questo:

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

Tutte le parentesi necessarie sono lì e [array count] - 1 non ha effetti collaterali, quindi i normali problemi macro non dovrebbero essere applicati. Qualche idea su cosa sta succedendo?

risposta

23

[array count] restituisce un NSUInteger - in altre parole, un numero intero senza segno. Quindi [array count] - 1 non è -1, è ((NSUInteger) -1), che è 0xFFFFFFFF o qualcosa del genere - che è maggiore di zero.

Ma quando si prende 0xFFFFFFFF e lo si passa come argomento a NSLog(@"%d"), NSLog lo considera come un numero intero con segno (perché si è utilizzato% d).

+0

Non ho notato che il valore restituito non era firmato, ma ha senso. Grazie! –