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?
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
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.
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.
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.
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:
sehen port70.net/~nsz/c/c11/n1570.html#6.5.9p3
– Christoph
7. August 2013 um 8:14 Uhr