2011-12-23 17 views
34

Czy !!(x) jest gwarantowane przez standard, aby zwrócić 0/1?Podwójna negacja w C: czy gwarantuje powrót do 0/1?

Zauważ, że jestem nie z pytaniem o C++, gdzie zdefiniowano typ bool.

+1

jaki standard? –

+0

@DanFego: To było dobrze zdefiniowane zachowanie, ponieważ C był najpierw standaryzowany, więc standard nie powinien mieć znaczenia. – jamesdlin

+1

możliwy duplikat [Co to jest! 0 w C?] (Http://stackoverflow.com/questions/3661751/what-is-0-in-c) – jamesdlin

Odpowiedz

42

Tak, w C99, zobacz §6.5.3.3/4:

wynikiem logicznego operatora negacji! jest jeżeli wartość jej argumentu porównuje nierówny 0, jeżeli wartość jej argumentu porównuje równa 0. Wynik musi wpisać int. Wyrażenie! E jest równoważne (0 == E).

Tak !x i !!y może jedynie otrzymując 0 lub 1 int s.

przypadku innych operatorów, w C99, patrz również Is the "true" result of >, <, !, &&, || or == defined?

+1

dzięki. tylko jeśli jesteś ciekawy dlaczego: używam go do konkurencji uni, gdzie mój kod będzie działał bez optymalizacji gcc, znalazłem użycie '!! x' zmniejszającego czas mojego kodu o ~ 5%, a następnie' x = (x? 1: 0) '. W każdym razie, dzięki za cytat z normy, było to bardzo pomocne. – amit

14

To jest komentarz naprawdę, ale to zbyt długo. (Proszę nie głosujcie na tej samej zasadzie).

Znalazłem bardzo dziwaczny dokument, szukając standardu, by odpowiedzieć na twoje pytanie: The New C Standard: An Economic and Cultural Commentary. Mówią, że akademia jest niedofinansowana. (Here jest pełnym, 2083 strona 10.5MB PDF .Jednym ogniwem jest tylko sekcja o podwójnej negacji.)

Ma to do powiedzenia na temat podwójnej negacji: "Podwójny negatyw jest bardzo często interpretowany jako pozytywne stwierdzenie w języku angielskim (np. "nie jest nieznane, że podwójne negatywne zjawisko występuje w źródle C.") Ta sama semantyka, która ma zastosowanie w C. Jednak w niektórych językach (np. hiszpańskim) podwójne negatywne interpretowane jest jako składające się na stwierdzenie bardziej negatywny (takie użycie pojawia się w swobodnej mowie angielskiej, np. "jeszcze nic nie widziałeś", ale jest rzadko spotykane i jest źle widziane, gdy towarzyszy mu 1). "

wierzę, że autor będzie szczęśliwy wiedząc, że to nie ma sensu w ogóle w odpowiedzi na swoje prawdziwe pytanie (na które odpowiedź brzmi: tak.)

+0

Proszę upomnij tego faceta za wysiłek badawczy! –

+1

kryteria głosowania są użyteczne, a ta odpowiedź, jak powiedziałeś, "nie ma żadnego sensu". –

+2

@PeteKirkham, z pełnym szacunkiem nie zgadzam się, tak jak najczęściej zadawane pytania: * "Użyj swoich pochlebstw za każdym razem, gdy natkniesz się na wyjątkowo niechlujny, nie obciążony wysiłkiem post, lub odpowiedź, która jest wyraźnie i być może niebezpiecznie niepoprawna." * W każdym razie, Wesołych Świąt i szczęśliwego Nowego Roku. –

Powiązane problemy