Valor de retorno del operador “==” en C

3 minutos de lectura

¿Puedo suponer que en C, el operador “==” siempre se evaluará como 1 si los dos valores son iguales o se puede evaluar como otros valores “verdaderos”?

struct ss {
    int id;
};

struct os {
    int sid;
    int state;
};

int count(struct ss *s, int state)
{
    int num = 0;
    // foreach o (of type os*) in a hash table
        num += o->state == state && (s ? o->sid == s->id : 1);

    return num;
}

Entonces o->sid == s->id devolverá siempre 1 o 0, o puede devolver otros valores?

¿Puedo suponer que en C, el operador “==” siempre se evaluará como 1 si los dos valores son iguales o se puede evaluar como otros valores “verdaderos”?

Sí, y también != > < >= <= todo el operador relacional.

C11 (ISO/CEI 9899:201x) §6.5.8 Operadores relacionales

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 lo es. false.107) El resultado tiene tipo int.

  • Cabe señalar que la garantía de C de que los operadores evalúan a 0 o 1 solo se cumple en condiciones “normales”. Si un programa contiene cualquier comportamiento descrito por el estándar C como “indefinido”, entonces permite que estos operadores (y cualquier otro) produzcan cualquier valor (u otros comportamientos). Por ejemplo, a < bdonde a y b son punteros a objetos no relacionados, tiene un comportamiento no definido por el estándar C. Esto es útil para tener en cuenta para la depuración: si uno observa que un programa hace algo “imposible” según el estándar C, esta es una pista de que puede contener un comportamiento “indefinido”.

    –Eric Postpischil

    20 de febrero de 2020 a las 12:28

avatar de usuario
Pierre Fourgeaud

De la norma:

6.5.8 Operadores relacionales

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 falsa. El resultado tiene tipo En t.

6.5.9 Operadores de igualdad

los == 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 En t. Para cualquier par de operandos, exactamente una de las relaciones es verdadera.

Para operandos lógicos (&&, || ) :

6.5.13 Operador lógico AND (o 6.5.14 Operador lógico OR)

los && (o ||) el operador dará 1 si sus dos operandos se comparan con cero; de lo contrario, arroja 0. El resultado es de tipo int.

Puedes consultar el último borrador aquí: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

Conclusión:

  • Todo el operador de igualdad y relacional (==, !=, <, >, <=, >=) regreso 0 por false y 1 por true.

  • Los operadores lógicos (==, ||, !) tratar 0 como false y otros valores como true por sus operandos. ellos también regresan 0 como false y 1 como true.

avatar de usuario
jonathan leffler

Los operadores de comparación (igualdad y relacional) (==, !=, <, >, <=, >=) todos devuelven 0 para falso y 1 para verdadero, y ningún otro valor.

Los operadores lógicos &&, || y ! son menos quisquillosos con sus operandos; tratan 0 como falso y cualquier valor distinto de cero como verdadero. Sin embargo, también devuelven solo 0 para falso y 1 para verdadero.

avatar de usuario
andreas fester

¿Puedo suponer que en C, el operador “==” siempre se evaluará como 1 si los dos valores son iguales o se puede evaluar como otros valores “verdaderos”?

Sí, para un compilador compatible con el estándar, esta suposición es correcta:

Lenguajes de programación — C, §6.5.9 Operadores de igualdad (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf):

Cada uno de los operadores da 1 si la relación especificada es verdadera y 0 si es falsa. El resultado tiene tipo int.

¿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