Является ли' bool ' базовым типом данных в C++?
Я получил это сомнение при написании некоторого кода. Является ли' bool ' базовым типом данных, определенным в стандарте C++, или это какое-то расширение, предоставляемое компилятором ? Я получил это сомнение, потому что Win32 имеет "BOOL", который является не чем иным, как typedef long. Также что произойдет, если я сделаю что-то вроде этого:
int i = true;
гарантируется ли" всегда", что переменная i будет иметь значение 1 или это снова зависит от компилятора, который я использую ? Далее для некоторых API-интерфейса Win32, которое принимает логическое значение в качестве параметра что произойдет, если я передам переменную bool?
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
компилятор