Ein Freund von mir hat mir scherzhaft diese Frage gestellt. Es sollte eine Bemerkung vom Typ "Ohne Frage" sein, aber dann habe ich eine Weile darüber nachgedacht und mir ein paar clevere " fast Lösungen ausgedacht".
Erster Versuch:
Wenn C jemals Quantencomputer unterstützt, kann es eine Antwort darauf geben. Ein q-Bit kann in vielen Zuständen gleichzeitig sein, also könnte es false AND true sein und diese Bedingung gibt
(BOOL)0.5
alias "Ja / nein / vielleicht-so" zurück - aber sobald Sie die Variable beobachten, wird das Ganze zusammenbrechen und werden wieder ungültig.
Zweiter Versuch:
Wenn X irgendwie als ein zufälliger Binärgenerator definiert werden könnte und Sie es in ein BOOL umwandeln, könnten Sie manchmal falsch werden. Ich bin mir nicht sicher, ob Sie das in C tun können, wenn Sie CLANG verwenden.
#define x (BOOL)!!(rand()%2)
Die Sprache, mit der wir darüber gesprochen haben, ist C , aber ich bin auch neugierig, ob jemand in any Sprachen irgendwelche Lösungen finden kann.
Es ist ein kleiner Trick, aber die folgende Lösung funktioniert auch:
%Vor% Der Grund liegt in der Vorrangstellung des Operators. Nach der Vorverarbeitung wird (x || !x)
zu folgendem aufgelöst (Klammern hinzugefügt, um die Priorität anzuzeigen):
Makros schummeln hier wirklich, aber Sie brauchen nichts mit booleschen Typen oder speziellen Compilern zu tun. Soweit ich weiß, handelt es sich um den Rechtsstandard C.
%Vor%Oder noch prägnanter:
%Vor% (Für diejenigen, die sich über undefiniertes Verhalten sorgen, beachten Sie, dass zwischen der linken und rechten Seite von ||
ein Sequenzpunkt liegt.)
Wenn x ein Zeichen-Typ ist (d. h. nicht int oder bool), dann kann eine Sprache wie JS, PHP usw. den Ausdruck als falsch ergeben.
Das bedeutet im Falle eines Tippfehlers
für
char x="Zeichenfolge";
(x ||! x) = Falsch (0 oder NaN)
Diese Sprache, die sie gut unterstützen, Typ-Casting zeigte keinen Fehler oder dieser Fehler kann durch Selbst-Casting entfernt werden.
selbst gegossen, z.B. char a="10"; int b = (int) a;
neu ver. der Sprache gehören auch Teig Cast Engeine.
In JS versucht:
var i = 0
i ++ || ! (i ++)
Hinweis: Diese Lösung funktioniert nur, wenn i = 0
istTags und Links c conditional boolean logic boolean-logic