c - examples - Es el resultado "verdadero" de>,<,!, &&, || o== definido?
operator c# (4)
C sigue la Ley de Postel para sus operadores booleanos: sé conservador en lo que haces, sé liberal en lo que aceptas 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í. 2 != 3
siempre es 1
.
Cuando, por ejemplo, escribo 7>1
en C (digamos C99 si esta no es una característica que siempre ha existido), ¿puedo esperar que el resultado sea exactamente 1 o solo un valor distinto de cero? ¿Esto es válido para todos los operadores bool?
De la norma ISO C99, sección 6.5.8:
6 Cada uno de los operadores <(menor que),> (mayor que), <= (menor o igual que), y> = (mayor o igual que) producirá 1 si la relación especificada es verdadera y 0 si Es falso. El resultado tiene tipo int.
De la sección 6.5.9:
3 Los operadores == (igual a) y! = (No igual a) son análogos a los operadores relacionales, excepto por su precedencia más baja. Cada uno 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 los operadores de conjunción lógica ( &&
) y disyunción ( ||
).
PD: Por cierto, esta es la razón por la que los operadores bitwise ( &
y |
) generalmente pueden usarse como versiones sin cortocircuito de los operadores lógicos.
En C99 §6.5.8 Operadores relacionales, elemento 6 ( <
, >
, <=
y >=
):
Cada uno de los operadores <(menor que),> (mayor que), <= (menor o igual que) y> = (mayor o igual que) producirá 1 si la relación especificada es verdadera y 0 si es falso) El resultado tiene tipo int .
En cuanto a los operadores de igualdad, es un poco más adelante en §6.5.9 ( ==
y !=
):
Los operadores == (igual a) y! = (No igual a) son análogos a los operadores relacionales, excepto por su precedencia más baja) Cada uno 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.
El AND lógico y el OR lógico están un poco más lejos en §6.5.13 ( &&
)
El operador && deberá generar 1 si sus dos operandos se comparan de manera desigual con 0; De lo contrario, da 0 . El resultado tiene tipo int .
... y §6.5.14 ( ||
)
El || el operador producirá 1 si alguno de sus operandos se compara con 0; De lo contrario, da 0 . El resultado tiene tipo int .
¡Y la semántica del operador aritmético unario !
han terminado en §6.5.3.3 / 4:
El resultado del operador de negación lógica! es 0 si el valor de su operando se compara con 0, 1 si el valor de su operando se compara con 0. El resultado tiene el tipo int . La expresión! E es equivalente a (0 == E).
El tipo de resultado es int
en general, con 0
y 1
como valores posibles. (A menos que me haya perdido un poco).
Todos los operadores C que producen valores lógicos verdaderos / falsos siempre producen un resultado de tipo int
con el valor 0
para falso, 1
para verdadero.
Ese no es el caso de 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 cierto.
Mientras use el resultado directamente como condición:
if (isdigit(c)) ...
if (!isdigit(c)) ...
if (isdigit(c) || islower(c)) ...
y no intentes compararlo con algo:
if (isdigit(c) == 1) ... /* WRONG */
if (isdigit(c) == true) ... /* ALSO WRONG */
Esto no debería causar ningún problema.
(Puede comparar de manera segura el resultado con 0
o false
, pero no hay una buena razón para hacerlo; para eso es el operador !
)