Liefert eine C-Bedingung immer 1 oder 0?

8

Geben bedingte C-Anweisungen immer [1 oder 0] zurück oder geben sie [0 oder 'etwas anderes als Null'] zurück. Ich frage, weil:

Pseudocode -

  

foo (Adresse, sollte senden):
  Registrieren & gt; & gt; = 1
  Register & lt; & lt; = 1 // Bit in erster Position löschen
  register | = sollteSenden // um zu signalisieren, ob es senden soll oder nicht

Das Problem tritt auf, wenn jemand IN in einen sumoSend-Wert von true größer als eins (als nur 0 ist falsch und alles andere ist wahr, technisch ist dies gültig) übergeben. Da ich den Wahrheitswert von sOnSend direkt mit dem register verknüpfe, ist es besser, nicht 0xFF zu sagen! Ich habe bereits eine Lösung, also ist die Frage mehr um der Neugier willen. Ich frage mich allerdings, ob:

  

foo (Adresse, sollte senden):
  Registrieren & gt; & gt; = 1
  Register & lt; & lt; = 1 // Bit in erster Position löschen
  register | = (sollte send & gt; 0) // um zu signalisieren, ob es senden soll oder nicht

löst das Problem? Ich würde denken, dass jetzt das Problem einer 0xFF (oder im Allgemeinen etwas größer als 1), die übergeben wird, durch die C-Bedingung maskiert wird. aber das gilt nur, wenn C-Bedingungen garantiert [0 oder 1] zurückgeben.

ps - ich verstehe auch, dass es wahrscheinlich compilerabhängig ist, aber was sagt der ansi-Standard dazu?

    
trh178 20.08.2010, 15:21
quelle

4 Antworten

16

Standard gibt an, dass das Ergebnis immer ein ganzzahliger Wert ist, der gleich 0 oder 1 ist

  

6.5.8 Relationale Operatoren

     

Jeder der Operatoren & lt; (weniger als), & gt;   (größer als), & lt; = (weniger als oder gleich   to) und & gt; = (größer oder gleich)   soll 1 ergeben, wenn das angegeben ist   Beziehung ist wahr und 0, wenn es ist   false.92) Das Ergebnis hat den Typ int.

    
Vladimir 20.08.2010, 15:24
quelle
1

Es spielt keine Rolle, ob es angegeben ist oder nicht. Es ist am besten, immer gegen falsch zu testen und explizit über Ihre Gleichwerte zu sein. Dies beseitigt jegliche Bedenken bezüglich Compiler-Implementierungen und ist klarer und wartungsfreundlicher.

    
Ken 20.08.2010 15:26
quelle
1

Anstatt rechts zu verschieben und dann wieder zurück zu schieben, um das LSB zu löschen, würde ich bitweise - und zwar mit 0xFE:

%Vor%

[edit: angenommen, Register ist 8 Bits. Wenn nicht, passen Sie den rechten Operanden wie erforderlich an.

Aber ja, wenn sentSend ein Ergebnis eines bedingten Tests ist, dann ist es durch den Standard garantiert, entweder 0 oder 1 zu sein. Wenn Zweifel bestehen, ob sendSend von irgendwo anders erzeugt werden könnte, wäre es klug, in den eine Art Vorsichtsmaßnahme, die Sie haben, oder so etwas wie

%Vor%     
Vicky 20.08.2010 15:29
quelle
0

Ja. Dies ist in C99 garantiert. Ich habe die C89-Spezifikation nicht zur Hand. Natürlich ist bekannt, dass Compiler-Implementierer gelegentlich Fehler machen, so YMMV.

C99 gibt Folgendes in Absatz 6 von an. 6.5.8 Relationale Operatoren :

  

Jeder der Operatoren & lt; (weniger als), & gt; (größer als), & lt; = (weniger als oder gleich to), und & gt; = (größer als oder gleich) soll 1 ergeben, wenn die angegebene Beziehung wahr ist, und 0, wenn es falsch ist.

Die gleichen oder ähnliche Klauseln erscheinen in Absatz 3 von 6.5.9 Gleichheitsoperatoren , Absatz 3 von 6.5.13 Logischer UND-Operator und Absatz 3 von 6.5.14 Logischer OR-Operator .

    
D.Shawley 20.08.2010 15:36
quelle

Tags und Links