Почему использование!! при преобразовании интервала в bool?

Первоначально смотря на него, почти похоже, обрубили ли Вы последние 6 цифр, Вы получили бы разумную Дату Unix с помощью преобразователь онлайн

1231721701 = понедельник, 12 января 2009 0:55:01 GMT

1227217588 = четверг, 20 ноября 2008 21:46:28 GMT

, которое дополнительные 6 цифр могли форматировать связанный или некоторые расширенные атрибуты.

существует некоторый пример кода для преобразование Меток времени Unix , если это на самом деле, каково это.

76
задан sharptooth 21 August 2009 в 12:04
поделиться

6 ответов

Проблемы с "!!" идиома в том, что это кратко, трудно увидеть, легко принять за опечатку, легко отбросить один из «!» и так далее. Я поместил его в категорию «посмотри, какие милые мы можем быть с C / C ++».

Просто напишите bool isNonZero = (integerValue! = 0); ... будьте ясны.

112
ответ дан 24 November 2019 в 11:09
поделиться

Исторически идиома !! использовалась, чтобы гарантировать, что ваш bool действительно содержит одно из двух значений, ожидаемых в переменной, подобной bool , потому что в C и C ++ не было истинного типа bool , и мы подделали его с помощью int s. Теперь это не проблема с «настоящими» bool s.

Но использование !! является эффективным средством документирования (как для компилятора, так и для будущих людей, работающих в ваш код), что да, вы действительно намеревались преобразовать этот int в bool .

49
ответ дан 24 November 2019 в 11:09
поделиться

Потому что! integerValue означает integerValue == 0 и !! integerValue, таким образом, означает integerValue! = 0, допустимое выражение, возвращающее bool. Последний - кастинг с потерей информации.

13
ответ дан 24 November 2019 в 11:09
поделиться

Логическое значение может иметь только два состояния, 0 и 1. Целое число может иметь любое состояние от -2147483648 до 2147483647, предполагая 32-битное целое число со знаком. Унарный! оператор выводит 1, если на входе 0, и 0, если на входе что угодно, кроме 0. Итак! 0 = 1 и! 234 = 0. Второй! просто переключает вывод так, что 0 становится 1, а 1 становится 0.

Таким образом, первая инструкция гарантирует, что booleanValue будет установлено равным 0 или 1 и никакое другое значение, а вторая инструкция - нет.

5
ответ дан 24 November 2019 в 11:09
поделиться

Нет особой причины, кроме параноика или воплей в коде, что это логическое значение.

для компилятора, в конце концов, это не имеет значения.

-1
ответ дан 24 November 2019 в 11:09
поделиться

Мне никогда не нравился этот метод преобразования в тип данных bool - он плохо пахнет!

Вместо этого мы используем удобный шаблон под названием ] boolean_cast найдено здесь . Это гибкое решение, которое более четко описывает то, что оно делает, и может использоваться следующим образом:

bool IsWindow = boolean_cast< bool >(::IsWindow(hWnd));
-2
ответ дан 24 November 2019 в 11:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: