objective c - tutorial - Que hace !! ¿Significa en sintaxis objetivo-c?




objective-c++ (4)

Encontré un código similar al siguiente:

BOOL hasValue_:1;

- (BOOL) hasValue {
    return !!hasValue_;
}

- (void) setHasValue:(BOOL) value {
    hasValue_ = !!value;
}

Me pregunto por qué son necesarios los dobles signos de exclamación. ¿No estamos ya pasando BOOL al método y devolviendo BOOL? ¿Es BOOL realmente un typedef para un int?

¡Gracias!

EDITAR
Gracias por todas las respuestas hasta ahora. Entiendo que usar !! con otros tipos de datos realiza efectivamente algunos procesos de conversión a un resultado booleano. Sin embargo, en el ejemplo anterior, ya estoy trabajando estrictamente con BOOL.

EDITAR
Si ya estoy trabajando con un BOOL, ¿por qué es necesario normalizarlo a 0 para falso y 1 para verdadero? ¿No garantiza BOOL que es falso para 0 y verdadero para todo lo demás?


... Algunos de sus dialectos, como C99 y Objective-C, proporcionan definiciones estándar de un tipo booleano como sinónimo de int y macros para "falso" y "verdadero" como 0 y 1, respectivamente.

Wikipedia - Tipo de datos booleano

Creo que la doble negación asegura que el valor de "verdadero" sea 1 (tal vez para usarlo en operaciones aritméticas).


Me pregunto por qué son necesarios los dobles signos de exclamación.

BOOL es un signed char , o un char presenta como un tipo booleano a través de typedef . Felizmente representará cualquier número entero en el rango [SCHAR_MIN...SCHAR_MAX] . El signo de exclamación doble aplica una operación NOT booleana dos veces, lo que convierte efectivamente el valor original a un int de 0 o 1, reduciendo el valor al rango de boolean.

Pero hay un giro: BOOL hasValue_:1; Declara una representación de campo de bits de un solo bit. Puede representar dos valores. return !!hasValue_; no es necesario. Sin embargo, es necesario que se reduzca correctamente cuando se pasa de un signed char ( BOOL ) a un bit.

¿No estamos ya pasando BOOL al método y devolviendo BOOL?

No Es un signed char . !!value reduce los valores de entrada a YES o NO .

Si ya estoy trabajando con un BOOL, ¿por qué es necesario normalizarlo a 0 para falso y 1 para verdadero?

¿No garantiza BOOL que es falso para 0 y verdadero para todo lo demás?

BOOL es un signed char . Un typedef de signed char no hace esta garantía.

C99 (que ha estado disponible para que lo uses durante muchos años cuando apuntas a osx o ios) tiene una representación de tipo booleano más útil ( bool ). Desafortunadamente, BOOL mantiene en uso regular en objc por razones históricas. Personalmente, uso BOOL solo cuando es necesario (p. Ej., Anulación).


Es el ! Operador aplicado dos veces. El operador niega su argumento booleano.

Entonces, ¿cuál es el punto de aplicarlo dos veces, no volverías donde empezaste? No necesariamente, ya que el tipo de argumento puede ser de cualquier tipo. Esto significa que usted podría tener algo como un entero i y verificar si es distinto de cero por !!i . Además, esto se usa a menudo para verificar si un puntero no es NULL, por ejemplo:

bool doTrace = !!getenv("MY_TEST_VAR");

Los puntos de exclamación dobles son una forma de convertir un entero en un BOOL, donde 1 (y CUALQUIER otro valor! = 0) es verdadero y 0 es falso. Además, lo que estás escribiendo es C y no objetivo-c. Su código también funcionará en un entorno C ++, ya que también es un derivado de c.





objective-c