Когда вы должны использовать bools в C ++?

34

У нас было задание для нашего класса, где мы должны были создать игру в крестики-нолики . Люди любят усложнять себя, поэтому они написали сложные игры, которые включали меню. В конце игры вам нужно было снова сыграть или выйти из программы. Для этого я использовал intпеременную, но заметил, что некоторые одноклассники используют BOOL.

Это более эффективно? В чем разница между хранением ответа, в котором должны храниться только два значения, intа не в буле? Каково точное назначение этих переменных?

Bugster
источник
32
Не уверен насчет эффективности, но цель int- сохранить целое число, а цель bool- сохранить логическое значение ( trueили false). Использование boolIMO отражает его использование гораздо лучше, чем использование int.
Джордж Дакетт
12
Фактически, до C ++ и C99 у C89 не было логического типа. Программисты часто typedef int Boolдля того, чтобы дать понять, что они используют логическое значение. C ++ интегрировал поддержку boolязыка, как и C99 с (довольно некрасивым) _Boolключевым словом.
Чарльз Сальвия
Речь идет не о «знать, когда использовать bool», а о том, почему у нас разные имена для похожих типов (например length_t), и почему важно, чтобы компилятор проверял типы.
Abyx,
Иногда ответ просто «вкус». Бьюсь об заклад, если вы переписываете то же самое назначение прямо сейчас, в этот момент будет несколько разных вещей, таких как порядок параметров функций и их имена. Почему вы не написали тот же порядок параметров или то же имя? Это потому, что вы просто не

Ответы:

82

При выборе типов переменных и имен переменных вы хотите, чтобы ваше намерение было максимально четким. Если вы выберете bool(логический) тип, становится ясно, что есть только два допустимых значения: trueили false. Если вы используете int(целочисленный) тип, больше не ясно, что намерение этой переменной может быть только 1 или 0 или любыми значениями, которые вы выбрали для значения trueи false. Плюс sizeof(int)обычно возвращается как 4 байта, в то время как sizeof(bool)возвращается 1.

Эндрю Т Финнелл
источник
7
Согласовано. Я думаю, что дизайнерские намерения важнее. Только изредка вам придется их переопределять.
ChrisF
9
Чтобы переформулировать точку зрения @ AndrewFinnel: Bool более самодокументирован. Переменная, которую вы установите в 0 или 1, может быть счетчиком; переменная, которую вы установили в true или false, явно является флагом.
Скотт С. Уилсон,
2
Bools предотвращает злоупотребление переменной для других целей. Целое число может быть установлено в значения, отличные от 0 или 1, для создания дополнительных состояний, о которых ваш код может не знать.
Михаил Шопсин
+1. Это проясняет намерение / варианты. Вы можете использовать любой метод для сохранения значения, включая строку со значением «да» или «нет», но вам следует выбрать тот, который имеет смысл MOST. В данном случае это логическое значение.
Крейг,
Я думал, что логические значения в C ++ были того же размера, что и целые числа, 4 байта.
DogDog
53

Кажется , во всех (до сих пор) собраны ответы никто не поймал тот факт , что ОП говорил о BOOLне bool.

Поскольку вопрос помечен C ++, следует отметить, что:

  • intпредставляет собой целое число , которое находится в пределах от INT_MINдо INT_MAX- макросы , определенные в <climits>которых значения зависят от архитектуры хостинга машины. В C ++ эти значения также доступны как std::numeric_limits<int>::min()и ...:max()соответственно). Поведение булевых операторов, применяемых для intобработки 0как ложных, а все остальное как истинных .
  • BOOLэто просто подсказка, предлагающая логическое поведение для int. Определяется <cstddef>как

    #define BOOL int
    #define TRUE 1
    #define FALSE 0
  • BOOLэто не что иное, как синтаксический сахар, для чего - компилятором - это не что иное, как int. Это то, что используют программисты на C, но программисты на C ++ должны избегать, поскольку C ++ имеет bool.

  • boolявляется языком интегрального типа, значение которого поддерживается только trueи false. Когда преобразовано в int trueстановится 1 и falseстановится 0.

Важным аспектом является то, что он более безопасен от ошибок программирования:

BOOL a = FALSE;  // in fact int a = 0;
a = 5; //now a == 5 -- what does it mean?;

невозможно кодировать с правильным типом bool:

bool a = false;
a = 5; // error: no bool(const int&) available.

Использование BOOLвместоbool - это просто плохая привычка, унаследованная от славного прошлого, которую никто до сих пор не может забыть, создавая тем самым старую проблему для менее славного завтрашнего дня.

Учителя языка должны серьезно подумать об этом!

Эмилио Гаравалья
источник
9
BOOL не является частью C ++ или языка C. BOOL с заглавными буквами - это наиболее распространенный способ реализации логических выражений в C, еще в старые времена, когда в C не было логического типа. Например, Windows API определит BOOL. Кроме того, нет никакой информации о том, как определяется BOOL, некоторые приложения могут определять его как однобитовое длинное битовое поле. Вы не можете предполагать, что оно всегда равно int только потому, что определенная библиотека определяет его таким образом.
1
+1. Возможно , он на самом деле сделал средний BOOL , а не логическое значение. Возможно, BOOL может быть реализован потенциально разными способами, хотя Codereview, вероятно, не знает об этом, если задает такой вопрос. Он видит, что он определен как int, поэтому он естественно спрашивает, почему он не может просто использовать int.
Нейл
1
@Lundin: в общем смысле вы правы, но учтите, что это ответ, выходящий за рамки вопроса, где OP говорил о BOOL и эквивалентности int.
Эмилио Гаравалья
Тем не менее, идея использовать BOOL или bool для обозначения намерений все еще применима.
Эндрю Финнелл
1
@zvrba: правда, но это связано с тем, что MS решила внедрить bool в свои собственные компиляторы. Он действителен только для компиляторов MS, работающих на процессорах Intel. Обратите внимание, что для платформы Intel каждый интегральный тип короче 32 бит требует маскировки на входе или выходе. Но char [] все еще используются и не всегда заменяются на int []
Эмилио Гаравалья
6

Типы Bool меньше, чем типы Int, поэтому занимают меньше места в памяти. В зависимости от системы, которую вы компилируете в / для, значение Int может быть 4–8 байтов, тогда как значение Bool составляет 1 байт (как можно увидеть в этой статье MSDN )

Сопоставьте это с некоторыми аспектами KISS и хорошим дизайном программы, и станет понятно, почему лучше использовать bool для хранения переменной, которая будет иметь только 2 значения.

Зачем усложнять вещи объектом, который может хранить широкий диапазон значений, если вы уверены, что вам нужно хранить только 1 из 2 различных значений?

Что происходит в системе, которая использует int, если вы храните там 75? Если вы добавили дополнительные условия

if (value >= 0 )
  return true;  //value is greater than 0, thus is true
else
  return false; //value is 0 or smaller than 0, thus is false

или

if (value == 0)
  return false;  //value is greater than 0, thus is true
else if (value == 1)
  return true; //value is 0 or smaller than 0, thus is false

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

Вы также можете иметь случай (в зависимости от того, как вы изменяете значение int), когда у вас переполнение буфера, и значение «сбрасывается» обратно до 0 или нижней границы вашего int (который может быть где-то в область от -127 до -9,223,372,036,854,775,808, в зависимости от вашей целевой архитектуры ) что тогда происходит в вашем коде?

Однако, если вы использовали bool, вы могли бы использовать что-то вроде этого:

if(continueBool == true)
  return true;
else
  return false;

Или даже:

return (continueBool== true) ? true : false;

или даже:

return continueBool;

В зависимости от вашего компилятора могут быть оптимизации, которые он может выполнять в коде, который использует Bools для хранения сопоставленных значений true / false. Принимая во внимание, что не может быть оптимизаций, которые он может выполнить для Ints, используемых для хранения сопоставленных значений true / false.

Мы также должны помнить, что C ++ (наряду с C, Assembly и FORTRAN) используется для написания очень эффективного, небольшого и быстрого кода. Таким образом, в этом случае было бы лучше использовать Bool, особенно если вы отмечаете использование переменных, памяти, кэша или процессорного времени.

Похожий вопрос: зачем мне хранить целое число (значение) в float? Ответ: не стоит, потому что нет смысла.

Короче говоря: как ваш учитель / репетитор / лектор / профессор, чтобы обсудить с вами размеры различных типов ценностей (в случае, если вы пропустили это), и почему они важны для разработки программного обеспечения.

Я надеюсь, что это поможет в качестве отправной точки (я также надеюсь, что это не выглядит как педантичный)

Джейми Тейлор
источник
4
Ненужное использование награды if (). Просто напишите return value >= 0;для первого примера.
zvrba
Я не был уверен на уровне понимания синтаксиса OP. Иногда полезно быть более многословным, чем обычно - особенно с тех пор, как OP упомянул, что это было задание
Джейми Тейлор
2
Не оспаривать, а просто указать, что сохранение трех байтов при выборе bool вместо int не приведет к заметным изменениям для большинства программ. Не беспокойтесь об эффективности, пока у вас не возникнут проблемы с производительностью!
Джеймс Андерсон
@James: также во многих случаях вы не будете сохранять три байта, потому что следующая переменная, если это не другой тип bool или char, вероятно, будет выровнена по границе четырех байтов.
JeremyP
1

Цель здесь - ясность намерения. Тип возвращаемого значения является частью интерфейса функций, и a boolговорит вам больше о том, что ожидать от функции, чемint делает.

Даже BOOLболее выразительный, чем int, хотя это тот же тип, он по крайней мере показывает ваши намерения.

Тем не менее, ни один из них я бы не рекомендовал:

enum class UiCmd {QUIT, START_GAME};
камикадзе
источник
-1

В программировании вы хотите представить что-то из реальной жизни в коде. Несмотря на то, что int и bool могут делать то же самое, основная идея совершенно другая: при использовании bool ответ может быть да или нет; и это все, это намерение. С целыми числами вы можете представлять количество без десятичной точки. И в том же духе, почему вы выбираете целое число, если двойник может сделать то же самое? Если целое число имеет больше смысла, чем двойное при моделировании задачи, тогда вы можете выбрать int.

fjrg76
источник
1
Похоже, это не дает ничего существенного по поводу высказанных и объясненных в верхнем ответе ответов, которые были опубликованы около 6 лет назад
gnat
-2

Потому что, в конце концов, вы все равно преобразуете свое целое число в логическое: «если (i = 1), тогда играйте в другую игру». В этой ситуации (i = 1) преобразуется в true или false: логическое значение.

Питер Б
источник
очень сильно зависит от того, на какой машине вы работаете, и от компиляторов. Вы можете быть удивлены, узнав, что на мэйнфреймах IBM односимвольный флаг с «Y» или «N» является наиболее эффективным способом реализации логической логики.
Джеймс Андерсон
4
Следует отметить, if (i = 1)что, вероятно, это очень неправильно в своем коде.