2012-02-24 23 views
6

En los comentarios aquí - https://stackoverflow.com/a/9393138/8047 - Descubrí que BOOL tiene un comportamiento inesperado al establecer su valor a partir de un valor int. Sobre todo, si el valor se establece en 0x1000 se evalúa como FALSE (sorprendentemente).Implicaciones de los valores int no "ajustados" - bool o BOOL para Objective-C?

NSLog(@"All zero? %d %d", (BOOL)0, (bool)0); 
NSLog(@"All one? %d %d %d", (BOOL)4095, (BOOL)4096, (BOOL)4097); // 4096=0x1000 or 8-bits 
NSLog(@"All one? %d %d %d", (bool)4095, (bool)4096, (bool)4097); 

Produces: 
All zero? 0 0 
All one? -1 0 1 
All one? 1 1 1 

creo que esto es extraño, pero de nuevo, no lo echa de la int a BOOL mucho de todos modos. Sin embargo:

  1. ¿Esto implica que bool se prefiere a BOOL? ¿Por qué o por qué no?
  2. ¿es correcto utilizar

if (thatBool) {

        o debería preferir uno

if (thatBool ? YES : NO) {

    Y por qué?

Nota: Esta es una versión más específica de esta pregunta de esto - Objective-C : BOOL vs bool - pero creo que se agrega y no es un duplicado.

Respuesta

3

creo que (BOOL)4096 se está evaluando a 0 es un simple desbordamiento aritmético, al igual que (BOOL)256, ya que es un BOOLunsigned char. Y creo que el truco !! de fundición ("doble negación") funciona bien:

NSLog(@"%i", (BOOL)256); // 0 
NSLog(@"%i", !!256); // 1 

Eso significa que haría uso de BOOL para mantener el estilo de codificación de cacao estándar y simplemente miro para el tipo peligroso arroja. La expresión thatBool ? YES : NO me lastima los ojos, ¿por qué querrías hacer eso? :)

+0

Cualquier enlace sobre el truco de lanzamiento '!!'? Estas cosas son un poco difíciles de buscar :) –

+0

Es una simple [doble negación] (http://www.google.com/search?q=c+double+negation), que debería ser más fácil de buscar. – zoul

+0

Gracias @zoul, sí, eso es bastante fácil. Creo que 'observar los modelos peligrosos' es correcto. –

2

1) bool es el tipo de C++, BOOL es el Objective-C. Fundición de int a BOOL no funciona correctamente porque YES es sólo (BOOL)1 = (signed char)1 (= 0x001) y que no es igual a (signed char)4 (= 0x100), por ejemplo.

2) Ambos funcionarán, el segundo podría ser ilegible para alguien con poca experiencia en programación. Prefiero la buena verificación de condición segura de c estilo antiguo con la constante de la izquierda para evitar la omisión accidental de uno de los signos iguales.

if (YES == isEnabled) { 

} 
+2

Simplemente agregando que "if (thatBool?SÍ: NO) {"es inútil, es solo un si dentro de un if (ifception!), Es lo mismo. – fbernardo

+1

Me gusta el estilo Yoda, siempre me imagino que el programador realmente habla así y es simplemente gracioso :) – JustSid

+0

Y en realidad es muy práctico :-D – Alexander

0

Al usar un int, siempre puede ser explícito al configurar un BOOL al comprobar si int es igual a un valor particular, p.

BOOL yesNo = ((int)4096 > 0); 
BOOL enableButton = (someInt >= 16); 

En otras palabras, no pase el int al BOOL directamente; conviértalo en una declaración de verdadero/falso.