Es el resultado “verdadero” de >,

4 minutos de lectura

Es el resultado verdadero de
mbq

Cuando por ejemplo escribo 7>1 en C (digamos C99 si esta no es una característica de siempre), ¿puedo esperar que el resultado sea exactamente 1 o simplemente algún valor distinto de cero? ¿Esto es válido para todos los operadores booleanos?

  • Lo más probable es que sea un duplicado, pero no pude encontrarlo 🙁

    – MBQ

    7 oct 2011 a las 12:42

  • @TRD: Incorrecto. La expresión C 7>1 da un resultado de tipo int con el valor 1.

    –Keith Thompson

    4 de febrero de 2012 a las 21:39

1647684126 222 Es el resultado verdadero de
Estera

En C99 §6.5.8 Operadores relacionales, artículo 6 (<,>,<= y >=):

Cada uno de los operadores < (menor que), > (mayor que), <= (menor que o igual a) y >= (mayor que o igual a) producirá 1 si la relación especificada es verdadera y 0 si es falso) El resultado tiene tipo En t.

En cuanto a los operadores de igualdad, se avanza un poco más en §6.5.9 (== y !=):

Los operadores == (igual a) y != (no igual a) son análogos a los operadores relacionales excepto por su menor precedencia) Cada uno de los operadores produce 1 si la relación especificada es verdadera y 0 si es falso. El resultado tiene tipo En t. Para cualquier par de operandos, exactamente una de las relaciones es verdadera.

El AND lógico y el OR lógico van un poco más allá en §6.5.13 (&&)

El operador && producirá 1 si sus dos operandos se comparan con cero; de lo contrario, rinde 0. El resultado tiene tipo En t.

… y §6.5.14 (||)

el || el operador debe ceder 1 si alguno de sus operandos se compara distinto de 0; de lo contrario, rinde 0. El resultado tiene tipo En t.

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 no es igual a 0, 1 si el valor de su operando se compara igual a 0. El resultado tiene tipo En t. La expresión !E es equivalente a (0==E).

El tipo de resultado es int en general, con 0 y 1 como posibles valores. (A menos que me perdí algunos).

  • Y convenientemente, stdbool.h define verdadero y falso como 1 y 0 (C99 7.16).

    – Lundin

    7 oct 2011 a las 13:20


  • Bien, especialmente porque && y || comportarse de manera diferente en otros idiomas (devolviendo el último valor evaluado). Si los operadores estándar no están involucrados, la sujeción se puede realizar utilizando !! o echando a <stdbool.h> bool.

    – Tobú

    5 de enero de 2014 a las 8:34

C sigue Ley de Postel 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. 2 != 3 es siempre 1.

1647684126 101 Es el resultado verdadero de
thkala

De la norma ISO C99, apartado 6.5.8:

6 Cada uno de los operadores < (menor que), > (mayor que), <= (menor o igual que) y >= (mayor o igual que) dará como resultado 1 si la relación especificada es verdadera y 0 si es verdadera. 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 menor precedencia. Cada uno de los operadores da 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 disyunción (||) operadores.

PD: Por cierto, esta es la razón por la que los operadores bit a bit (& y |) generalmente se pueden usar como versiones sin cortocircuito de los operadores lógicos.

Todo C operadores que arrojan valores lógicamente verdadero/falso siempre arrojan un resultado de tipo int con el valor 0 por falso, 1 de verdad.

Ese no es el caso para todos los C expresiones que producen valores lógicamente verdaderos/falsos. por ejemplo, el is*() funciones de clasificación de caracteres declaradas en <ctype.h> (isdigit(), isupper()etc) volver 0 si la condición es falsa, pero puede devolver cualquier valor distinto de cero si la condición es verdadera.

Siempre que use el resultado directamente como condición:

if (isdigit(c)) ...
if (!isdigit(c)) ...
if (isdigit(c) || islower(c)) ...

y no intenta compararlo con algo:

if (isdigit(c) == 1) ...    /* WRONG */
if (isdigit(c) == true) ... /* ALSO WRONG */

esto no debería causar ningún problema.

(Tú lata comparar con seguridad el resultado con 0 o false, pero no hay una buena razón para hacerlo; eso es lo que ! el operador es para.)

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad