!! безопасный способ преобразовать в bool в C++?

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

49
задан Community 23 May 2017 в 02:10
поделиться

16 ответов

Аргумент! оператор и первый аргумент тернарного оператора оба неявно преобразовываются в bool, таким образом!! и?: глупые избыточные художественные оформления IMO броска. Я голосую за

b = (t != 0);

Никакие неявные преобразования.

82
ответ дан fizzer 7 November 2019 в 11:15
поделиться

Я использовал бы bool b = t и оставил бы предупреждение компиляции внутри, комментируя безопасность этой конкретной строки. Отключение предупреждения может укусить Вас в торце в другой части кода.

-4
ответ дан Paul Nathan 7 November 2019 в 11:15
поделиться

Двойное не чувствует себя забавным мне, и в отладке код будет очень отличаться, чем в оптимизированном коде.

, Если Вы любите!! Вы всегда могли Макрос это.

#define LONGTOBOOL(x) (!!(x))

(как в стороне, тернарный оператор - то, что я одобряю в этих случаях)

-2
ответ дан plinth 7 November 2019 в 11:15
поделиться

Я рекомендую использовать

если (x! = 0)

или

, если (x! = ПУСТОЙ УКАЗАТЕЛЬ)

, вместо если (x); это более понятно и читаемо.

-1
ответ дан Marco M. 7 November 2019 в 11:15
поделиться

!! только полезно, когда Вы используете булево выражение арифметическим способом, например:

c = 3 + !!extra; //3 or 4

(Чей стиль является различным обсуждением.), Когда все Вам нужно, булево выражение!! избыточно. Запись

bool b = !!extra;

имеет столько же смысла сколько:

if (!!extra) { ... }
0
ответ дан aib 7 November 2019 в 11:15
поделиться

Отключите предупреждение.

Запись для ясности сначала; тогда профиль; тогда оптимизируйте для скорости при необходимости.

0
ответ дан Jay Bazuzi 7 November 2019 в 11:15
поделиться

Я использовал бы b = (0! = t) - по крайней мере, любой нормальный человек может считать его легко. Если бы я видел бы дважды блин в коде, я был бы в значительной степени удивлен.

0
ответ дан 7 November 2019 в 11:15
поделиться

!! может быть компактным, но я думаю, что это излишне сложно. Лучше отключить предупреждение или использовать тернарный оператор, по-моему.

1
ответ дан Kristopher Johnson 7 November 2019 в 11:15
поделиться

Если Вы волнуетесь по поводу предупреждения, можно также вынудить состав исполнителей: bool b = (bool)t;

2
ответ дан warren 7 November 2019 в 11:15
поделиться

Я никогда рекомендую не подавить то предупреждение, и никогда использование c бросило (bool) для подавления его. Преобразования нельзя всегда называть, как Вы предполагаете.

существует различие между выражением, которое оценивает к истинному и булевской переменной того значения.

Оба!! и троичное взятие, привыкающее к, но, сделает задание точно так же, если Вы не захотите определять внутренние типы с перегруженными бросками к bool.

подход Dima прекрасен также, так как он присваивает значение выражения к bool.

3
ответ дан tabdamage 7 November 2019 в 11:15
поделиться

Я не использовал бы:

bool b = !!t;

, Который является наименее читаемым путем (и таким образом самое твердое для поддержания)

, Другие зависят от ситуации.
, Если Вы преобразовываете в использование в bool выражении только.

bool b = t ? true : false;
if (b)
{
    doSomething();
}

Тогда я позволил бы языку сделать это для Вас:

if (t)
{
    doSomething();
}

, Если Вы на самом деле храните булево значение. Тогда сначала я задался бы вопросом, почему у Вас есть длинное в первых местах, которое требует броска. Для принятия Вас нужны длинное и значение bool, я рассмотрел бы все следующее в зависимости от ситуации.

bool  b = t ? true : false;      // Short and too the point.
                                 // But not everybody groks this especially beginners.
bool  b = (t != 0);              // Gives the exact meaning of what you want to do.
bool  b = static_cast<bool>(t);  // Implies that t has no semantic meaning
                                 // except as a bool in this context.

Сводка: Используйте то, что обеспечивает большую часть значения для контекста, в котором Вы находитесь.
Пытаются сделать его очевидным, что Вы делаете

6
ответ дан m13r 7 November 2019 в 11:15
поделиться


Да это безопасно.


0 интерпретируется как ложь, все еще верно,
следовательно! 5 выходит как ложь
! 0 выходит как верный
так!! 5 выходит как верный

6
ответ дан EvilTeach 7 November 2019 в 11:15
поделиться

Все допустимые методы, все генерируют тот же код.

Лично, я просто отключаю предупреждение, таким образом, я могу использовать самый чистый синтаксис. Кастинг к bool не что-то, что я волнуюсь по поводу выполнения случайно.

6
ответ дан 7 November 2019 в 11:15
поделиться

Осторожный!

  • булевская переменная А об истине и ошибочности.
  • целое число о целых числах.

Те - очень отличные понятия:

  • Истина и ошибочность о решении материала.
  • Числа о подсчете материала.

При образовании моста тех понятий, это должно быть сделано явно. Мне нравится версия Dima лучше всего:

b = (t != 0);

, Что код ясно говорит: Сравните два числа и сохраните значение истинности в булевской переменной.

31
ответ дан edgar.holleis 7 November 2019 в 11:15
поделиться

С другой стороны, можно сделать это: bool b = (t != 0)

41
ответ дан Dima 7 November 2019 в 11:15
поделиться

Я действительно ненавижу!! t!!!!!!. Это имеет привкус худшей вещи о C и C++, искушение быть слишком умным наполовину с Вашим синтаксисом.

bool b (t! = 0);//лучший способ, по моему скромному мнению, он явно показывает то, что происходит.

2
ответ дан Jim In Texas 7 November 2019 в 11:15
поделиться
Другие вопросы по тегам:

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