Подтвердить что ты не робот

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

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

int i = true;

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

4b9b3361

Ответ 1

bool является фундаментальным типом данных в С++. Преобразование 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 базовым типом данных (и, следовательно, ключевым словом) из-за проблем с совместимостью с существующим кодом.

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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

if(someval == true){

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

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

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