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?
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.
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%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 .
Tags und Links c standards conditional