Является ли 'bool' базовым типом данных в C ++?

Я получил это сомнение при написании кода. Является ли 'bool' базовым типом данных, определенным в стандарте C ++, или это своего рода расширение, предоставляемое компилятором? Я получил это сомнение, потому что Win32 имеет «BOOL», который является просто typedef long. И что произойдет, если я сделаю что-то вроде этого:

int i = true;

Всегда ли гарантируется, что переменная i будет иметь значение 1, или это снова зависит от используемого компилятора? Далее для некоторых Win32 API, которые принимают BOOL в качестве параметра, что произойдет, если я передам переменную bool?

59 c++
10.12.2008 16:44:40
7 ОТВЕТОВ
РЕШЕНИЕ

bool является фундаментальным типом данных в C ++. Преобразование trueв целочисленный тип даст 1, а преобразование falseдаст 0 (4,5 / 4 и 4,7 / 4). В C до C99 не было типа данных bool, и люди делали что-то вроде

enum bool {
    false, true
};

Как и Windows API. Начиная с C99, у нас _Boolесть базовый тип данных. В том числе stdbool.hбудет typedef, #define что boolи предоставить константы trueи false. Они не сделали bool базовым типом данных (и, следовательно, ключевым словом) из-за проблем совместимости с существующим кодом.

77
26.05.2010 18:46:53

C ++ выполняет множество автоматических преобразований для вас - то есть, если у вас есть переменная типа boolи вы передаете ее чему-то ожидающему int, она превратит ее в « intдля вас» - 0для falseи 1для true.

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

Однако полагаться на это преобразование - плохая идея. Код может перестать компилироваться, если добавлен новый метод, который перегружает intподпись и т. Д.

5
10.12.2008 16:48:26

да, это было введено в 1993 году.

для дальнейшего использования: логический тип данных

2
10.12.2008 16:49:47
Извините, я не вижу на странице Boolean Datatype, котораяbool стала частью языка C в 1993 году. Теперь в 1999 году стандарт C99 добавил встроенный логический тип: он называется _Bool. (Он typedefэд к boolдля удобства , но boolне на самом деле встроенный самого типа.)
Colin D Bennett 23.04.2014 16:09:39
@ColinDBennett, да, по этой ссылке нет цитирования. Однако вопрос был о C ++, поэтому C является тангенциальным. Quick Googling не находит никаких категорических ссылок на C ++ и 1993, только предложение добавить boolнаписанное в этом году. Я не чувствую, как надо искать результаты и предполагаю, что реальный ответ где-то похоронен в каком-то стандарте. В любом случае, этот эффективный ответ только для ссылок теперь осиротел.
underscore_d 20.11.2015 21:04:15
Хорошо, вы правы, я почему-то упустил тот факт, что вопрос был о C ++. По крайней мере, в истории Cppreference C ++ говорится, что она boolбыла добавлена ​​в версию языка ISO C ++ 98.
Colin D Bennett 21.11.2015 00:26:43

Да, bool является встроенным типом.

WIN32 - это код C, а не C ++, и C не имеет bool, поэтому они предоставляют свой собственный typedef BOOL.

8
10.12.2008 16:50:11
У C сейчас есть bool, но он не вернулся, когда впервые появился api win32.
Joel Coehoorn 10.12.2008 16:51:51
Также есть BOOLEAN и VARIANT_BOOL: см. Blogs.msdn.com/oldnewthing/archive/2004/12/22/329884.aspx
Adam Rosenfield 10.12.2008 16:55:37
Джоэл: Хорошо, тогда Win32 - это C89, у которого нет bool. ;)
jalf 10.12.2008 17:03:25

C должен быть на шаг выше языка ассемблера. Оператор C if на самом деле является просто синтаксическим сахаром для "branch-if-zero", поэтому идея логических значений как независимого типа данных была в то время чужой концепцией. (1)

Даже сейчас логические значения C / C ++ обычно немного больше, чем псевдоним для однобайтового типа данных. Таким образом, это действительно скорее целевая метка, чем независимый тип данных.

(1) Конечно, современные компиляторы немного более продвинуты в обработке операторов if. Это с точки зрения C как нового языка.

1
10.12.2008 16:58:38

Несмотря на то, что он теперь является нативным типом, он все еще определяется за кулисами как целое число (как мне кажется), где литерал falseравен 0, а trueравен 1. Но я думаю, что вся логика все еще рассматривает все, кроме 0, как истинный, так что, строго говоря, истинный литерал вероятно, ключевое слово для компилятора, чтобы проверить, если что-то не так.

if(someval == true){

вероятно, переводится как:

if(someval !== false){ // e.g. someval !== 0

компилятором

-1
10.12.2008 17:00:46
Это может быть реализовано таким образом, но, по крайней мере, в случае VC ++, 4 байта, лежащих в основе значения bool, всегда устанавливаются в 0 или 1.
James Hopkin 10.12.2008 17:04:16
Я имею в виду, что четыре байта, интерпретируемые как int, имеют значение 0 или 1
James Hopkin 10.12.2008 17:04:56
Вы думаете о языке как VB, возможно, это не правильно для C ++. x == true не является сокращением для некоторого теста на истинность x, это применение оператора '==' к двум значениям. Конечно, ошеломляющие правила C ++ применяются, чтобы выбрать, какой перегруженный оператор == применяется, и принудительно
Spike0xff 9.11.2012 19:18:04

Компилятор Turbo C и C ++ не поддерживает тип данных логического (ключевое слово bool), но компилятор dev c ++ поддерживает тип данных логического (ключевое слово bool).

2
26.09.2011 18:06:58
Turbo C / C ++ не совместим с C99 - он использует очень старый (и теперь устаревший) стандарт, поэтому вы не можете увидеть ключевое слово bool там.
Narayan Ramamurthi 10.04.2016 11:34:59