Коли слід використовувати bools у C ++?


34

У нас було завдання для нашого класу, де нам довелося створити гру « Tic-tac-toe» . Люди люблять ускладнювати себе, тому вони писали складні ігри, до яких входили меню. Наприкінці гри вам довелося мати можливість знову зіграти або вийти з програми. Я використовував intзмінну для цього, але я помітив деяких однокласників, що використовують BOOL.

Це ефективніше? Яка різниця між зберіганням відповіді, яка повинна зберігати лише два значення, intа не зберігати їх у bool? Яка точна мета цих змінних?


32
Не впевнений у ефективності, але мета a int- це збереження цілого числа, а мета a 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, явно є прапором.
Скотт C Вілсон

2
Пульти запобігають зловживанню змінною для інших цілей. Ціле число можна встановити на значення, відмінні від 0 або 1, щоб створити додаткові стани, про які ваш код може не знати.
Майкл Шопсін

+1. Це робить чіткий намір / параметри. Ви можете скористатися будь-яким способом, який вам подобається, щоб зберегти значення, включаючи рядок зі значенням "так" або "ні", але слід вибрати той, який має МОСТО сенс. У цьому випадку це булевий характер.
Крейдж

Я подумав, що булеві символи в C ++ мають такий же розмір, як і ints, 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. БУЛ з великими літерами є найпоширенішим способом булевих застосувань у C, ще за старих часів, коли С не мав булевого типу. Наприклад, API Windows визначить BOOL. Крім того, немає жодної інформації про те, як визначено BOOL, деякі програми можуть визначати його як бітове довге поле. Ви не можете припустити, що він завжди дорівнює int лише тому, що певна бібліотека визначає його таким чином.

1
+1. Можливо, він насправді мав на увазі BOOL, а не bool. Можливо, BOOL може бути реалізований потенційно різними способами, хоча Codereview, ймовірно, не знає, що якщо він задає подібне питання. Він бачить, що це визначено як int, тому він, природно, запитує, чому він не може просто використовувати int.
Ніл

1
@Lundin: в загальному сенсі ви правильні, але вважайте, що це відповідь, яка залишається всередині питання, де ОП говорило про BOOL та внутрішню еквівалентність.
Еміліо Гаравалья

Тим не менш, ідея використання 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 для зберігання відображених істинних / хибних значень. Тоді як оптимізація, яку вона може виконувати для Ints, що використовується для зберігання відображених істинних / хибних значень, може бути не визначено.

Ми також повинні пам’ятати, що C ++ (разом із C, Assembly та FORTRAN) використовується для написання високоефективного, малого та швидкого коду. Отже, було б краще використовувати Bool в цьому випадку - особливо якщо ви позначаєтесь на використанні змінних, пам'яті, кешу або часу процесора.

Аналогічне запитання було б: чому я б зберігав ціле число (значення) у плавці? Відповідь: Не слід, бо немає сенсу.

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

Я сподіваюся, що це допомагає як відправна точка (я також сподіваюся, що це не сприймається як педантичне)


4
Непотрібне використання if () нагороди. Просто напишіть return value >= 0;для першого прикладу.
zvrba

Я не був впевнений на рівні розуміння синтаксису ОП. Іноді корисно бути дещо більш багатослівним, ніж зазвичай - тим більше, що ОП згадувало, що це було завдання
Джеймі Тейлор

2
Не погоджуватися - але просто зазначити, що збереження трьох байтів шляхом вибору bool через int не має значної зміни для більшості програм. Не хвилюйтеся про ефективність, поки у вас справді не виникне проблема з продуктивністю!
Джеймс Андерсон

@James: також у багатьох випадках ви не збережете три байти, оскільки наступна змінна, якщо це не інший bool або char, ймовірно, вирівняється до чотирьох байтових меж.
JeremyP

1

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

Навіть BOOLвиразніше int, хоч це той самий тип, який, принаймні, показує ваш намір.

Однак жоден з них не рекомендував би:

enum class UiCmd {QUIT, START_GAME};

-1

У програмуванні ви хочете представити щось із реального життя в коді. Незважаючи на те, що int і bool можуть робити те ж саме, підмінна ідея зовсім інша: при використанні bool відповідь може бути так чи ні; і це все, у цьому є намір. З цілими числами ви можете представляти величини без десяткової коми. І в тому ж дусі, чому б ви вибрали ціле число, коли подвійне може зробити те саме? Якщо ціле число має більше сенсу, ніж подвійне при моделюванні проблеми, то ви можете вибрати інт.


1
це, здається, не пропонує нічого суттєвого щодо питань, викладених та пояснених у верхній відповіді тут, що була розміщена приблизно 6 років тому
gnat

-2

Тому що, врешті-решт, ви все одно перетворите ціле число на булеве значення: "if (i = 1), то грайте в іншу гру". У цій ситуації (i = 1) перетворюється на істинну чи хибну: булева.


дуже залежить від того, на якій машині ви працюєте та компіляторах. Ви можете бути здивовані, коли дізнаєтесь, що на IBM mainframes один прапор символів з "Y" або "N" - це найефективніший спосіб реалізації булевої логіки.
Джеймс Андерсон

4
Зауважимо, if (i = 1)це, мабуть, дуже неправильна річ у коді.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.