Pregunta simple realmente; ¿Hay alguna diferencia entre estos valores (y hay una diferencia entre BOOL y bool)? Un compañero de trabajo mencionó que evalúan diferentes cosas en Objective-C, pero cuando miré los typedefs en sus respectivos archivos .h, YES / TRUE / true se definieron como 1
NO y FALSE / false se definieron como 0
. Hay realmente alguna diferencia?
objective-c
boolean
Kevlar
fuente
fuente
Respuestas:
No hay diferencia práctica siempre que use
BOOL
variables como booleanos. C procesa expresiones booleanas en función de si evalúan a 0 o no a 0. Entonces:significa lo mismo que
Es por eso que puede evaluar cualquier tipo o expresión primitiva como una prueba booleana (incluidos, por ejemplo, punteros). Tenga en cuenta que debe hacer lo primero, no lo segundo.
Tenga en cuenta que no es una diferencia si asigna valores obtusos a una llamada
BOOL
variable y prueba para valores específicos, por lo que siempre utilizarlos como booleanos y sólo asignarlos a partir de sus#define
valores.Es importante destacar que nunca pruebe booleanos utilizando una comparación de caracteres: no solo es arriesgado, ya que
someVar
podría asignarse un valor distinto de cero que no sea SÍ, sino que, en mi opinión, lo más importante es que no expresa la intención correctamente:En otras palabras, use construcciones como están destinadas y documentadas para ser utilizadas y se ahorrará un mundo de dolor en C.
fuente
Creo que es una diferencia entre
bool
yBOOL
, echa un vistazo a la página para una explicación de por qué:http://iosdevelopertips.com/objective-c/of-bool-and-yes.html
Como
BOOL
es un tipounsigned char
más que primitivo, las variables de tipoBOOL
pueden contener valores distintos deYES
yNO
.Considera este código:
El resultado es:
Para la mayoría de las personas, esta es una preocupación innecesaria, pero si realmente quieres un booleano, es mejor usar a
bool
. Debo agregar: el SDK de iOS generalmente usaBOOL
en sus definiciones de interfaz, por lo que es un argumento para seguirBOOL
.fuente
bool
, y por lo tanto, ha sido la tradición usar unint
ochar
como un booleano, a veces con un #definir para ocultar la diferencia y otras no. De hecho, no estoy seguro si incluso los estándares actuales requierenbool
ser implementados de una manera que evite examinar su estructura interna.printf
dice mentiras. El valor deb
no esYES
, es "no cero", que es lo que prueba la condición. Entonces deberías tenerprintf("b is not zero")
, que no es necesariamente lo mismo queYES
. En este caso,b
es "no cero" y "no SÍ".Hice una prueba exhaustiva sobre esto. Mis resultados deberían hablar por sí mismos:
El resultado es:
fuente
if
o unwhile
. Como ...while("guitar gently weeps")
no debería funcionar ...if (user_id = ROOT_UID)
Es posible que desee leer las respuestas a esta pregunta . En resumen, en Objective-C (de la definición en objc.h):
fuente
La principal diferencia (¡peligrosa!) Entre
true
yYES
está en la serialización JSON.Por ejemplo, tenemos una solicitud de servidor de tipo JSON y necesitamos enviar verdadero / falso en sentido json:
Luego lo convertimos a una cadena JSON antes de enviarlo como
El resultado es
Debido a la lógica de la API
jsonString1
podría provocar un error.Así que ten cuidado con los booleanos en Objective-C.
En resumen, solo los
@YES
valores exactos y convertidos@((BOOL)expression)
son de__NSCFBoolean
tipo y se conviertentrue
con serialización JSON. Cualquier otra expresión como@(expression1 && expression2)
(even@(YES && YES)
) es de__NSCFNumber (int)
tipo y se convierte1
en JSON.PD: simplemente puede usar un valor booleano de cadena
fuente
Hay un error sutil que nadie ha mencionado aquí, que pensé que incluiría ... más un error lógico que cualquier otra cosa:
así que el problema aquí es solo eso
(YES==1)
y en C la comparación no es booleana, sino basada en el valor.porque
YES
es solo un#define
(en lugar de algo intrínseco al lenguaje), tiene que tener algún valor y1
tiene más sentido.fuente
Creo que agregan SÍ / NO para explicarse más en muchos casos. Por ejemplo:
suena mejor que
fuente
Primero examinemos qué es verdadero y falso y qué les da significado en primer lugar.
podemos construir una estructura llamada if a then b else c en cálculo lambda de la siguiente manera:
En JavaScript, esto se ve así:
para que ifThenElse sea útil, necesitamos una función "true" que elija derecha o izquierda, y lo hace mientras ignora la otra opción, o una función "false" que elige la opción "true" no toma.
Podemos definir estas funciones de la siguiente manera:
en JavaScript se ve así:
ahora podemos hacer lo siguiente
con doThis y doThat siendo (\ a. ()) porque el cálculo lambda no ofrece ningún servicio como impresión / matemática / cadenas, todo lo que podemos hacer es no hacer nada y decir que lo hicimos (y luego hacer trampa reemplazándolo con servicios en nuestro sistema que proporciona los efectos secundarios que queremos)
así que veamos esto en acción.
Ese es un entorno profundo que podría simplificarse si se nos permitiera usar matrices / mapas / argumentos / o más de una declaración para dividir en múltiples funciones, pero quiero mantenerlo tan puro como puedo limitarme a las funciones de exactamente un argumento solamente.
tenga en cuenta que el nombre Verdadero / Falso no tiene un significado inherente, podemos cambiarles el nombre fácilmente a sí / no, izquierda / derecha, derecha / izquierda, cero / uno, manzana / naranja. Tiene importancia porque cualquier elección que se haga, solo es causada por el tipo de elección que se hizo. Por lo tanto, si se imprime "IZQUIERDA", sabemos que el seleccionador solo puede ser verdadero y, en base a este conocimiento, podemos guiar nuestras decisiones adicionales.
Entonces para resumir
fuente
No, SÍ / NO es una forma diferente de referirse a VERDADERO / FALSO (1/0)
fuente