2010-09-07 14 views
16

Wiem, że w C, jeśli oświadczenia i porównania FAŁSZ = 0 i cokolwiek innego równa prawdziwe.Co to jest! 0 w C?

Stąd

int j = 40 
int k = !j 

k == 0 // this is true 

Moje pytanie obsługuje przeciwnego. Co to jest! 0? 1?

int l = 0 
int m = !l 

m == ? // what is m? 
+12

Dlaczego nie spróbować? –

+1

@Josh K: Idealna rada. Chciałbym, żeby wszyscy najpierw to wypróbowali, a potem zapytali o wyniki, które oni faktycznie otrzymali. –

+13

@Josh K: Ponieważ może się różnić w zależności od kompilatora/standardu/dnia tygodnia (jeśli nie jest to zdefiniowane zachowanie, na przykład, chociaż oczywiście w tym przypadku), więc zobaczenie pojedynczej wartości wyniku może nie odzwierciedlać dokładnie tego, co to jest będzie na każdej innej danej konfiguracji. –

Odpowiedz

30

logicznych/operatorów logicznych w C są wymagać d otrzymując 0 lub 1.

Z sekcji 6.5.3.3/5 normy ISO C99:

Wynik logiczny operatora negacji ! wynosi 0, gdy wartość jego operandu porównuje nierówny 0, 1, jeżeli wartość jej argumentu porównuje równe 0.

w rzeczywistości !!x jest wspólne idiom za zmuszanie wartość być 0 lub 1 (ja osobiście wolę x != 0, choć).

Zobacz także Q9.2 from the comp.lang.c FAQ.

+3

Dobra rozmowa. Wygląda na to, że więcej z nas musi naprawdę przeczytać ten cholerny standard ISO. –

+4

+1 za wskazanie standardu, ale kod, który używa '!!', musi iść prosto do kosza na śmieci. –

+0

Oczywiście nie wiele kompilatorów C czuje się szczególnie zobowiązanych do przestrzegania standardu ISO. GCC prawdopodobnie, ale z kimkolwiek innym to crapshoot. –

1

Generalnie tak, to będzie stać 1. To powiedział, że nawet jeśli jest zagwarantowane zachowanie (które nie jestem pewien) Pomyślę kod, który opierał się na tym, by być dość straszne.

Można przypuszczać, że jest to prawdziwa wartość. Nie zakładałbym niczego więcej.

+8

Nie tylko ogólnie; *zawsze*. Operatory Boole'a w C muszą zwracać 0 lub 1. – jamesdlin

+0

Mimo to, wydaje się, że jest to pogwałcenie zamiaru twojego kodu. –

+2

Wcale nie. Rzeczy takie jak 'prefix =" - "+! Neg;' są idealnie rozsądne C. –

1

operator Bang (!) Jest nie logiczny operator znaleźć powszechnie w C, C++ i C#, więc

!0 == 1 
!1 == 0 

ta opiera się na charakterystycznej językowej, co jest interpretowane jako prawdziwe lub fałszywe. .. w bardziej nowoczesnych języków byłoby jak ten

!false == true 
!true == false 

Zobacz DeMorgan ustawy dotyczącej tablica prawdy ...

+3

Właściwie w C++ '!' Przyjmuje operand 'bool' i daje wynik' bool' - chociaż dla zgodności wstecznej istnieją niejawne konwersje z 'bool' na' int', z 'true' z konwersją na' 1 'i' false' na '0' oraz z innych typów całkowitych na' bool', z '0' konwersją na' false', i dowolną inną wartością konwersji na 'true'. –

3

§6.5.3.3/5: "Wynik operatora logicznej negacji! Wynosi 0, jeśli wartość jego argumentu jest porównywalna do 0, 1, jeśli wartość jego argumentu jest równa 0. Wynik ma typ int . "

Inne operatory logiczne (np. &&, ||) zawsze generują również 0 lub 1.

0

!x będzie rozszerzać się (x==0) tak:

  • gdy x = 0 ->!x wartość odbioru z (0==0) = PRAWDA (wartość 1)
  • gdy x = 0 ->!x wartość odbioru z (x==0)! = FALSE (wartość 0)