Rückgabewert des Operators “==” in C

Lesezeit: 3 Minuten

Kann ich davon ausgehen, dass in C der Operator “==” immer 1 ergibt, wenn die beiden Werte gleich sind, oder andere “wahre” Werte ergeben kann?

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;
}

So o->sid == s->id wird immer 1 oder 0 zurückgeben, oder kann es andere Werte zurückgeben?

Kann ich davon ausgehen, dass in C der Operator “==” immer 1 ergibt, wenn die beiden Werte gleich sind, oder andere “wahre” Werte ergeben kann?

Ja, und das tut es auch != > < >= <= alle relationalen Operatoren.

C11 (ISO/IEC 9899:201x) §6.5.8 Vergleichsoperatoren

Jeder der Operatoren < (kleiner als), > (größer als), <= (kleiner als oder gleich) und >= (größer als oder gleich) soll 1 ergeben, wenn die angegebene Beziehung wahr ist, und 0, wenn dies der Fall ist false.107) Das Ergebnis ist vom Typ int.

  • Es sei darauf hingewiesen, dass die Garantie von C, dass die Operatoren zu 0 oder 1 auswerten, nur unter „normalen“ Bedingungen gilt. Wenn ein Programm ein Verhalten enthält, das vom C-Standard als „undefiniert“ beschrieben wird, dann erlaubt es diesen Operatoren (und allen anderen), überhaupt irgendeinen Wert (oder andere Verhaltensweisen) zu erzeugen. Zum Beispiel, a < bwo a und b sind Zeiger auf nicht verwandte Objekte, haben ein Verhalten, das nicht durch den C-Standard definiert ist. Dies ist beim Debuggen nützlich: Wenn man beobachtet, dass ein Programm etwas „Unmögliches“ nach dem C-Standard tut, ist dies ein Hinweis darauf, dass es möglicherweise „undefiniertes“ Verhalten enthält.

    – Eric Postpischil

    20. Februar 2020 um 12:28 Uhr

Benutzer-Avatar
Pierre Fourgeaud

Von der Norm:

6.5.8 Vergleichsoperatoren

Jeder der Operatoren < (kleiner als), > (größer als), <= (kleiner als oder gleich) und >= (größer als oder gleich) muss ergeben 1 wenn die angegebene Relation wahr ist und 0 wenn sie falsch ist. Das Ergebnis hat Typ int.

6.5.9 Gleichheitsoperatoren

Das == Die Operatoren (gleich) und != (ungleich) sind analog zu den Vergleichsoperatoren, abgesehen von ihrer niedrigeren Priorität. Jeder der Operatoren ergibt 1 wenn die angegebene Relation wahr ist und 0 wenn sie falsch ist. Das Ergebnis hat Typ int. Für jedes Paar von Operanden ist genau eine der Relationen wahr.

Für logische Operanden (&&, || ) :

6.5.13 Logischer UND-Operator ( oder 6.5.14 Logischer ODER-Operator )

Das && (oder ||) Operator soll 1 ergeben, wenn beide Operanden ungleich 0 sind; andernfalls ergibt es 0. Das Ergebnis hat den Typ int.

Den letzten Entwurf können Sie hier einsehen: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

Fazit :

  • Alle Gleichheits- und Vergleichsoperatoren (==, !=, <, >, <=, >=) Rückkehr 0 zum false und 1 zum true.

  • Die logischen Operatoren (==, ||, !) behandeln 0 wie false und andere Werte wie true für ihre Operanden. Sie kehren auch zurück 0 wie false und 1 wie true.

Benutzer-Avatar
Jonathan Leffler

Die Vergleichsoperatoren (Gleichheit und relationale) (==, !=, <, >, <=, >=) geben alle 0 für falsch und 1 für wahr zurück – und keine anderen Werte.

Die logischen Operatoren &&, || und ! sind weniger wählerisch in Bezug auf ihre Operanden; Sie behandeln 0 als falsch und jeden Wert ungleich Null als wahr. Sie geben jedoch auch nur 0 für falsch und 1 für wahr zurück.

Benutzer-Avatar
Andreas Fester

Kann ich davon ausgehen, dass in C der Operator “==” immer 1 ergibt, wenn die beiden Werte gleich sind, oder andere “wahre” Werte ergeben kann?

Ja, für einen standardkonformen Compiler ist diese Annahme richtig:

Programmiersprachen — C, §6.5.9 Gleichheitsoperatoren (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf):

Jeder der Operatoren ergibt 1, wenn die angegebene Beziehung wahr ist, und 0, wenn sie falsch ist. Das Ergebnis hat den Typ int.

1374860cookie-checkRückgabewert des Operators “==” in C

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy