Cuando, por ejemplo, escribo 7>1
en C (digamos C99 si esta no es una característica que se haya utilizado siempre), ¿puedo esperar que el resultado sea exactamente 1 o solo un valor distinto de cero? ¿Esto es válido para todos los operadores bool?Es el resultado "verdadero" de>, <,!, &&, || o == definido?
Respuesta
En Operadores relacionales §6.5.8 C99, punto 6 (<
, >
, <=
y >=
):
Cada uno de los operadores < (menor que),> (mayor que), < = (menor o igual a), y> = (mayor que o igual a) deberá dar si la relación especificada que es verdadero y si es falsa) el resultado ha escriba int.
En cuanto a los operadores de igualdad, que es un poco más lejos en §6.5.9 (==
y !=
): operadores
El == (igual a) y = (distinto de) son análogos a los operadores relacionales excepto por su menor prioridad) Cada uno de los operadores produce si la relación especificada es verdadera y si es falsa. El resultado tiene el tipo int. Para cualquier par de operandos , exactamente una de las relaciones es verdadera.
La lógica AND y OR lógico todavía un poco más lejos están en §6.5.13 (&&
)
El operador & & rendirá si ambos de sus operandos comparar desigual a 0; de lo contrario, produce . El resultado tiene el tipo int.
... y §6.5.14 (||
)
La || el operador rendirá si cualquiera de sus operandos compara desigual a 0; de lo contrario, produce . El resultado tiene el tipo int.
Y la semántica del operador aritmético unario !
son más en §6.5.3.3/4:
El resultado del operador negación lógica! es si el valor de su operando compara desigual a 0, si el valor de su operando compara igual a 0. El resultado ha escriba int. La expresión! E es equivalente a (0 == E).
tipo de resultado es int
en todos los ámbitos, con 0
y 1
valores posibles. (A menos que me haya perdido algo).
Y convenientemente stdbool.h define verdadero y falso como 1 y 0 (C99 7.16). – Lundin
Bueno, especialmente porque && y || se comportan de manera diferente en otros idiomas (devolviendo el último valor evaluado). Si los operadores estándar no están involucrados, la fijación se puede hacer usando '!!' o [fundición a '
C sigue Postel's Law para sus operadores booleanos: sea conservador en lo que hace, sea liberal en lo que acepta de los demás. Tratará cualquier valor distinto de cero como verdadero en expresiones booleanas, pero siempre producirá un 0 o un 1 en sí mismo. 2 != 3
es siempre 1
.
+1 por mencionar la Ley de Postel – glglgl
de la norma ISO C99, sección 6.5.8:
6 Cada uno de los operadores < (menor que),> (mayor que), < = (menos de o igual a), y > = (mayor que o igual a) rendirá 1 si la relación especificada es verdadera y 0 si es falsa. El resultado tiene tipo int.
De la sección 6.5.9:
3 El == (igual a) y = (no igual a) los operadores son análogos a los operadores relacionales excepto por su menor precedencia. Cada de los operadores produce 1 si la relación especificada es verdadera y 0 si es falsa. El resultado tiene tipo int. Para cualquier par de operandos, exactamente una de las relaciones es verdadera.
Lo mismo sucede con la conjunción lógica (&&
) y (||
) operadores disyunción.
PD: A propósito, esta es la razón por la cual los operadores bit a bit (&
y |
) pueden usualmente usarse como versiones sin cortocircuito de los operadores lógicos.
Todos C operadores que producen valores lógicamente verdadero/falso siempre producen un resultado de tipo int
con el valor 0
para falsa, 1
para la verdadera.
Ese no es el caso para todas las expresiones C que producen valores lógicamente verdaderos/falsos. Por ejemplo, las funciones de clasificación de caracteres is*()
declaradas en <ctype.h>
(isdigit()
, isupper()
, etc.) devuelven 0
si la condición es falsa, pero pueden devolver cualquier valor distinto de cero si la condición es verdadera.
Como siempre y cuando utilice el resultado directamente como una condición:
if (isdigit(c)) ...
if (!isdigit(c)) ...
if (isdigit(c) || islower(c)) ...
y no lo hacen intento de comparar a algo:
if (isdigit(c) == 1) ... /* WRONG */
if (isdigit(c) == true) ... /* ALSO WRONG */
esto no debería causar ningún problema .
(Usted puede comparar con seguridad el resultado de 0
o false
, pero no hay una buena razón para hacerlo, eso es lo que el operador !
es para.)
- 1. .htaccess prueba si ENV es verdadero o está definido
- 2. AutomaticMigrationsEnabled ¿es falso o verdadero?
- 3. php - ¿VERDADERO o verdadero? personas
- 4. ¿Por qué el resultado de bool (verdadero) && string es una cadena en javascript?
- 5. ¿Cuál es el resultado esperado al redefinir de verdadero a falso y viceversa?
- 6. El siguiente código imprime "verdadero, verdadero, falso, verdadero". ¿No debería ser "verdadero, verdadero, verdadero"?
- 7. Comprobar si boolean es verdadero
- 8. Ningún resultado definido para la acción y el resultado de entrada
- 9. ¿Cómo verificar si un parámetro es verdadero o falso?
- 10. ¿cuál es la diferencia de retorno verdadero o falso aquí?
- 11. Es el comportamiento del retorno x ++; definido?
- 12. ¿Cómo puedo convertir bool verdadero o falso a la cadena "Verdadero" o "Falso"
- 13. ¿FileDelete() devuelve verdadero o falso para el archivo inexistente?
- 14. ¿Cuál es el nombre para el operador "<<<"?
- 15. <% $, <% @, <% =, <% # ... ¿cuál es el problema?
- 16. Excel: ¿VLOOKUP que devuelve verdadero o falso?
- 17. Devolver verdadero o falso al azar
- 18. Prólogo O (;) Regla Devolver Resultado Múltiple
- 19. Cómo comprobar el valor de retorno de la función si es verdadero o falso
- 20. Pregunta de LINQ donde el valor booleano es verdadero o falso
- 21. Javascript cierto no está definido o entre comillas
- 22. C++ palabras clave 'verdadero' y 'falso' de repente no es verdadero o falso en Visual C++ 6.0
- 23. ¿Cuál es el verdadero propósito de la codificación Base64?
- 24. PHP - Comprobando si el resultado es falso;
- 25. Comportamiento de una expresión: ¿definido o indefinido?
- 26. ¿El código de nombre de Microsoft.VisualBasic es "verdadero .NET"?
- 27. Shell: ¿"a -lt b" no significa verdadero si a es menor que b?
- 28. Cómo generar <opción seleccionada = "verdadero"> de JSPX?
- 29. ¿Qué operador es más rápido (> o> =), (<o <=)?
- 30. amigo en el operador == o << ¿cuándo debería usarlo?
lo más probable es un duplicado, pero no estaba capaz de encontrarlo :-( – mbq
@TRD: Incorrecto. La expresión C '7> 1' produce un resultado de tipo' int' con el valor '1'. –