operator examples bitwise and c logical-operators

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 ! )