Я предполагаю, что это просто возвращает int. Что-то еще происходит, о чем я должен знать? Различия в C/C++?Что происходит, когда вы логически не плаваете?
float a = 2.5;
!a; // What does this return? Int? Float?
Я предполагаю, что это просто возвращает int. Что-то еще происходит, о чем я должен знать? Различия в C/C++?Что происходит, когда вы логически не плаваете?
float a = 2.5;
!a; // What does this return? Int? Float?
Относительно C++, C++, со ссылкой на 11 §5.3.1/9:
Операнд логического оператора отрицания
!
является контекстуально преобразуется вbool
; его значение равноtrue
, если преобразованный операнд равенfalse
иfalse
в противном случае. Тип результата:bool
.
Так что действительно отношение здесь поведение static_cast<bool>(some_float)
– цитирование §4.12/1:
prvalue арифметики, незаданного перечисления, указатель, или указателя типа элемента может быть преобразован в обозначение типа
bool
. Нулевое значение, значение нулевого указателя или значение указателя нулевого элемента преобразуется вfalse
; любое другое значение преобразуется вtrue
. Значение типаstd::nullptr_t
может быть преобразовано в prvalue типаbool
; результирующее значение равноfalse
.
Ввод их вместе, 2.5f
является ненулевым значением и, следовательно, будет оценивать с true
, который, когда инвертированным будет оценивать с false
. I.e., !a
== false
.
Относительно C, со ссылкой на C99 §6.5.3.3/5:
В результате логической операции отрицания
!
является0
, если значение операнда сравнивается с неравными0
,1
если значение его операнда сравнивается с0
. Результат имеет типint
. Выражение!E
эквивалентно(0==E)
.
I.e. чистый результат такой же, как у C++, за исключением типа.
Смотрите сами:
#include <iostream>
int main()
{
float a = 2.5;
if (!a)
std::cout << !a << "\n";
else
std::cout << !a << "\n";
}
Проблема с «наблюдением за собой» заключается в том, что вы можете наблюдать неопределенное или определяемое реализацией поведение, которое говорит только о том, что происходит на вашей конкретной платформе/компиляторе, что не полезно, когда вы знаете, чего ожидать в терминах _величин-определенного_ поведения , – ildjarn
Вы не можете «ожидать» чего-либо от «поведения, определенного реализацией». Так что же «четко определено» для вас? – 01100110
Именно поэтому «убедитесь сами» - бесполезный ответ, если поведение определяется реализацией. Спасибо, что согласились с моей точкой зрения. :-P – ildjarn
От here
Поплавок будет преобразован в ложь, если ее точно 0.0f,
Это будет также верно, если его не exacly 0.0f!
Inifinity также преобразуется в true.
Я не был уверен в отрицании бесконечности, поэтому я проверил здесь выход http://ideone.com/WWoJB#view_edit_box –
, если точно + 0.0f, -0.0f имеет бит, установленный и перевернутый, все еще имеет немного set –
@dwelch Я не знал этого, я думаю, вы узнаете что-то новое, повседневное – cctan
Возможный ответ [здесь] (http://stackoverflow.com/questions/1969620/c-float-to-bool-conversion) – cctan