2012-03-23 2 views

ответ

36

Относительно 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++, за исключением типа.

+0

Спасибо! Я предполагаю, что это означает, что в C я получаю int? –

+1

@ Натан: Да, это правильно. Ответ отредактирован с подробностями. – ildjarn

+3

@NathanFig: Правильно, результат '!' В C всегда является 'int'. – caf

0

Смотрите сами:

#include <iostream> 

int main() 
{ 
    float a = 2.5; 

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

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

Проблема с «наблюдением за собой» заключается в том, что вы можете наблюдать неопределенное или определяемое реализацией поведение, которое говорит только о том, что происходит на вашей конкретной платформе/компиляторе, что не полезно, когда вы знаете, чего ожидать в терминах _величин-определенного_ поведения , – ildjarn

+0

Вы не можете «ожидать» чего-либо от «поведения, определенного реализацией». Так что же «четко определено» для вас? – 01100110

+9

Именно поэтому «убедитесь сами» - бесполезный ответ, если поведение определяется реализацией. Спасибо, что согласились с моей точкой зрения. :-P – ildjarn

7

От here

Поплавок будет преобразован в ложь, если ее точно 0.0f,
Это будет также верно, если его не exacly 0.0f!
Inifinity также преобразуется в true.

+2

Я не был уверен в отрицании бесконечности, поэтому я проверил здесь выход http://ideone.com/WWoJB#view_edit_box –

+0

, если точно + 0.0f, -0.0f имеет бит, установленный и перевернутый, все еще имеет немного set –

+0

@dwelch Я не знал этого, я думаю, вы узнаете что-то новое, повседневное – cctan

Смежные вопросы