2012-03-23 32 views
23

Zakładam, że po prostu zwraca int. Czy coś jeszcze się dzieje, o czym powinienem wiedzieć? Różnice C/C++?Co stanie się, gdy logiczne nie będzie float?

float a = 2.5; 
!a; // What does this return? Int? Float? 
+2

Możliwe odpowiedzi [tutaj] (http://stackoverflow.com/questions/1969620/c-float-to-bool-conversion) – cctan

Odpowiedz

36

chodzi C++, C++ 11 podając §5.3.1/9:

Argument logicznego operatora negacji ! kontekstowo przekształcany bool; jego wartość to true, jeśli przekonwertowany operand to false i false w przeciwnym razie. Typ wyniku to bool.

Więc co naprawdę istotne jest tu zachowanie static_cast<bool>(some_float) – cytując §4.12/1:

prvalue arytmetyki, unscoped wyliczenia wskaźnika lub wskaźnik do typu członek może być przekształcony wartość prod. typu bool. Wartość zerowa, zerowa wartość wskaźnika lub wartość wskaźnika elementu zerowego jest przekształcana na false; każda inna wartość jest konwertowana na true. Wartość produtu typu std::nullptr_t można przekonwertować na wartość prodynkową typu bool; uzyskana wartość to false.

Wprowadzenie tych razem 2.5f jest różna od zera, a w związku z tym ocenia się true, które, gdy do pozbawienia oceni się false. Tj. !a == false.


chodzi C, podając C99 §6.5.3.3/5:

Wynik logiczny operatora negacji ! jest 0 jeśli wartość jego operandu porównuje nierówny 0, 1 jeżeli wartość jego argumentu operacji jest równy 0. Wynik ma typ int. Wyrażenie !E jest równoważne z (0==E).

tj. wynik netto jest taki sam jak w C++, z wyjątkiem typu.

+0

Dzięki! Zakładam, że to oznacza w C, dostanę int? –

+1

@Nathan: Tak, zgadza się. Odpowiedź edytowana ze szczegółami. – ildjarn

+3

@NathanFig: Tak, wynik '!' W C jest zawsze 'int'. – caf

0

Zobacz sam:

#include <iostream> 

int main() 
{ 
    float a = 2.5; 

    if (!a) 
     std::cout << !a << "\n"; 

    else 
     std::cout << !a << "\n"; 
} 
+9

Problem z "widzeniem dla siebie" polega na tym, że możesz zaobserwować niezdefiniowane lub zdefiniowane przez implementację zachowanie, które mówi tylko, co dzieje się na twojej platformie/kompilatorze, co nie jest przydatne, gdy wiemy, czego się spodziewać w kategoriach _zdefiniowanego_ zachowania . – ildjarn

+0

Nie można "oczekiwać" niczego od zachowania "zdefiniowanego przez implementację". Co oznacza dla ciebie "dobrze zdefiniowane"? – 01100110

+9

Dokładnie, dlatego "zobacz dla siebie" jest bezużyteczną odpowiedzią, jeśli zachowanie jest zdefiniowane przez implementację. Dziękuję za wyrażenie zgody na mój punkt widzenia. :-P – ildjarn

7

Od here

Pływak zostaną zamienione na false, jeżeli jej dokładnie 0.0f,
Będzie również prawdą, jeśli jej nie exacly 0.0f!
Inifinity zostanie również przekonwertowane na true.

+2

Nie byłem pewny co do negacji nieskończoności, więc sprawdziłem tutaj jest wyjście http://ideone.com/WWoJB#view_edit_box –

+0

jeśli dokładnie + 0.0f, -0.0f ma bitową ustawioną i odwróconą wciąż ma trochę set –

+0

@dwelch Nie wiedziałem tego, domyślam się, że nauczysz się czegoś nowego codziennie – cctan

Powiązane problemy