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?
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?
chodzi C++, C++ 11 podając §5.3.1/9:
Argument logicznego operatora negacji
!
kontekstowo przekształcanybool
; jego wartość totrue
, jeśli przekonwertowany operand tofalse
ifalse
w przeciwnym razie. Typ wyniku tobool
.
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 nafalse
; każda inna wartość jest konwertowana natrue
. Wartość produtu typustd::nullptr_t
można przekonwertować na wartość prodynkową typubool
; uzyskana wartość tofalse
.
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
!
jest0
jeśli wartość jego operandu porównuje nierówny0
,1
jeżeli wartość jego argumentu operacji jest równy0
. Wynik ma typint
. Wyrażenie!E
jest równoważne z(0==E)
.
tj. wynik netto jest taki sam jak w C++, z wyjątkiem typu.
Zobacz sam:
#include <iostream>
int main()
{
float a = 2.5;
if (!a)
std::cout << !a << "\n";
else
std::cout << !a << "\n";
}
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
Nie można "oczekiwać" niczego od zachowania "zdefiniowanego przez implementację". Co oznacza dla ciebie "dobrze zdefiniowane"? – 01100110
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
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.
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 –
jeśli dokładnie + 0.0f, -0.0f ma bitową ustawioną i odwróconą wciąż ma trochę set –
@dwelch Nie wiedziałem tego, domyślam się, że nauczysz się czegoś nowego codziennie – cctan
Możliwe odpowiedzi [tutaj] (http://stackoverflow.com/questions/1969620/c-float-to-bool-conversion) – cctan