2010-09-24 20 views
9

que estoy viendo un comportamiento extraño con la macro MAX en Objective C. En concreto, tengo este código en mi función principal:Objetivo C MAX insecto 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 salida es:

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

me salvó la salida del preprocesador con -save-temps, y se ve así:

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

Todos los paréntesis necesarios están ahí y [array count] - 1 no tiene efectos secundarios, por lo que los problemas de macro habituales no deberían aplicarse. ¿Tienes idea de lo que está pasando?

Respuesta

23

[array count] devuelve un NSUInteger - en otras palabras, un entero sin signo. Entonces [array count] - 1 no es -1, es ((NSUInteger) -1), que es 0xFFFFFFFF o algo así, que es mayor que cero.

Pero cuando toma 0xFFFFFFFF y lo pasa como argumento a NSLog(@"%d"), NSLog lo trata como un entero con signo (porque usó% d).

+0

No me di cuenta de que el valor de retorno no estaba firmado, pero tiene sentido. ¡Gracias! –