2016-02-28 38 views
8

Mój przyjaciel żartobliwie zadał mi to pytanie. Miała to być uwaga typu "rzeczą oczywistą", ale wtedy pomyślałem o tym przez chwilę i zacząłem wymyślać jakieś sprytne "prawie rozwiązań".Kiedy jest (x ||! X) fałsz?

Pierwsza próba:

Jeśli C kiedykolwiek obsługuje informatyka kwantowa nie może być odpowiedzią na to. Q-bit może być w wielu stanach na raz, więc może być fałszywy i prawdziwy, a ten warunkowy zwróci (BOOL)0.5 aka "Tak/nie/może-tak" - ale gdy zauważysz zmienną, cała rzecz się zwinie i stanie się nieważna jeszcze raz.

Druga próba:

Jeśli X może być jakoś zdefiniowana jako generatora binarnym i oddasz go do BOOL można uzyskać fałszywe raz na jakiś czas. Nie jestem pewien, czy możesz to zrobić w C, chyba że używasz CLANG. #define x (BOOL)!!(rand()%2)



Językiem omawialiśmy to w to C ale jestem też ciekaw, czy ktoś może znaleźć żadnych rozwiązań w dowolny językowej.

+2

Odpowiedź: Niezdefiniowane zachowanie. – SLaks

+9

To pytanie, które Hamlet prosił setki lat temu: 'bb || ! bb'. – nsilent22

+0

@ nsilent22 Zaśmiałem się trochę hardhard –

Odpowiedz

16

Gdy x jest niestabilny (volatile int x) i jest modyfikowany przez zewnętrzny wątek/urządzenie, wyrażenie może być fałszywe.

+0

Ciekawe rozwiązanie! Zastanawiam się, czy istnieje sposób, aby to zrobić bez bezpośredniej modyfikacji zmiennej w innym punkcie kodu –

+0

Jak wskazałem, jeśli 'x' jest zmapowany do zewnętrznie zmodyfikowanej lokalizacji/rejestru pamięci, może się zdarzyć" spontanicznie " – Amit

+0

masz rację! To całkiem genialne! Chociaż nie zawsze * zawsze * jest fałszywe, hmm –

4

Makra naprawdę oszukują, ale nie trzeba nic robić z typami boolowskimi lub kompilatorami specjalnymi. Dodaje się, o ile mi wiadomo, jest norma prawna C.

#include <stdio.h> 
int f(void) { 
    static int y = 0; 
    if (y == 0) { 
    y = 1; 
    return 0; 
    } else { 
    return 1; 
    } 
} 

#define x f() 

int main(void) { 
    if (x || !x) { 
    puts("It was true"); 
    } else { 
    puts("It was false"); 
    } 
    return 0; 
} 

Albo nawet bardziej zwięźle:

int y = 0; 
#define x y++ 

(Dla tych, martwi się o zachowanie niezdefiniowane, trzeba pamiętać, że jest to punkt sekwencja pomiędzy lewym i prawa strona ||)

+0

Pracowałem nad czymś takim za pomocą CLANG w Obj-C. Mam ten daleko '#define X (Bool) [[NSUserDefaults standardUserDefaults] integerForKey: @ "x"]; [[NSUserDefaults standardUserDefaults] setInteger: (int) (BOOL) [[NSUserDefaults standardUserDefaults] integerForKey: @ "x"] forKey: @ "x"]; [[NSUserDefaults standardUserDefaults] zsynchronizować]; 'zanim zdam sobie sprawę, że nie mogę mieć funkcji wewnątrz warunków w celu-c (o ile mi wiadomo) –

+0

@AlbertRenshaw: Nie mam pojęcia, co to robi, ale wydaje się, że jest zbyt skomplikowane. –

9

To trochę trick, ale działa również następujące rozwiązanie.

#define x 1 ? 0 : 1 
(x || !x) 

Przyczyna leży w priorytecie operatora. Po przerób (x || !x) postanawia następujące (nawiasach dodanych pokazać pierwszeństwo):

(1 ? 0 : (1 || !1) ? 0 : 1) 
+1

To jest genialny - jak dotąd odpowiedz: –

+2

Możesz jeszcze prostsze: '#define x 1 && 0' lub nawet # #define x 1,0' – Joni

+0

@Joni To jest świetna odpowiedź! Proszę napisać: D –

4

Jeszcze prostsze makro:

#define x 0&0 

rozszerza (x || !x) daje (0 & 0 || !0 & 0) który jest zawsze fałszywe.

Podobnie:

#define x 0*0 
#define x 1*0 // for binary buffs 
#define x 4&2 // for HHGG fans. 

nie mogłem znaleźć makro 2 się :(

+0

W tym przypadku makro "... & 0" zadziała – vittore

+1

@vittore: rzeczywiście '1 & 0' będzie działało i ma mniej pikseli, a' 4 & 2' jest bardziej nerdy. – chqrlie

2

Jeśli x jest typem charecter (czyli nie int lub bool) wtedy jakiś język jak JS, PHP itp może spowodować wyrażenie jako fałszywe.

oznacza, że ​​w przypadku błędu odlewniczej typu

dla

char x = "ciąg";

(x ||! X) = False (0 lub NaN)

że język wspierają typ dobrze odlew nie wykazał żadnego błędu lub błąd ten może zostać usunięty przez odlewanie siebie.

siebie odlew np char a = "10"; int b = (int) a;

nowa wersja. języka obejmują również pałeczki do obsady engeine.

1

Tried w JS:

var i = 0

i ++ || ! (i ++)

Uwaga: to rozwiązanie działa tylko wtedy, gdy i = 0

+0

proszę nacisnąć przycisk przykładowy Kod, który można wyświetlić jako {}, a następnie wkleić kod. –