Wann ist (x ||! x) falsch?

8

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.

    
Albert Renshaw 28.02.2016, 21:19
quelle

6 Antworten

16

Wenn x flüchtig ist ( volatile int x ) und von einem externen Thread / Gerät geändert wird, kann der Ausdruck false sein.

    
Amit 28.02.2016, 21:25
quelle
9

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):

%Vor%     
Dirk Herrmann 28.02.2016 21:39
quelle
4

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.)

    
Nate Eldredge 28.02.2016 21:28
quelle
4

Ein noch einfacheres Makro:

%Vor%

expanding (x || !x) gibt (0 & 0 || !0 & 0) , was immer falsch ist.

Ähnlich:

%Vor%

Ich konnte kein Makro mit zwei Buchstaben finden: (

    
chqrlie 28.02.2016 22:10
quelle
2

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.

    
Prashant Kumar 19.04.2016 12:24
quelle
1

In JS versucht:

var i = 0

i ++ || ! (i ++)

Hinweis: Diese Lösung funktioniert nur, wenn i = 0

ist     
Oana Silvia Tivadar 20.10.2017 13:40
quelle