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


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

int i = true;

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

7 54
c++

7 ответов:

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

enum bool {
    false, true
};

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

да, bool-это встроенный тип.

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

C++ делает много автоматического литья для вас - то есть, если у вас есть переменная типа bool и передать его к чему-то ожидая int, это сделает его в int для вас - 0 на false и 1 на true.

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

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

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

дополнительные сведения: Типом Данных Boolean

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

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

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

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

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

if(someval == true){

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

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

компилятор