2014-01-29 5 views
2

Я читаю книгу на C. В ней говорится, что C99 добавил тип данных _Bool. Это, в основном, int, но сохраняет только 0 или 1. Теперь я не понимаю, почему существует необходимость в таком типе данных. У нас уже есть bool, который неявно переводит на int и наоборот. Так может кто-нибудь, пожалуйста, скажите мне, где такой тип данных был бы полезен.Потребность в _Bool в C99?

PS: C++, похоже, не поддерживает такой тип данных, как показано на рисунке here.

#include <iostream> 
using namespace std; 

int main() { 
    // your code goes here 
    _Bool b = false; 
    if(b == 0) 
     printf("FALSE"); 
    else 
     printf("TRUE"); 
    return 0; 
} 

ответ

3

Он говорит, что C99 добавил переменную _Bool

Нет, C99 добавил встроенный тип, называемый _Bool, который может иметь значения либо 0, либо 1. Заголовок, <stdbool.h> определяет макросы, в которых bool расширяет до _Bool, false до 0 и true до 1.

С другой стороны, C++ имеет встроенный тип, называемый bool, который может иметь значения true и false. Для совместимости C++ 11 указывает, что stdbool.h должен присутствовать, но пуст. (Некоторые компиляторы C, предоставляемые C++ 's bool как продолжение предварительного C99.)

Намерения с дополнениями C99 были обеспечить такие же возможности, как C++, но таким образом, чтобы не аннулирует старый код C89 (где обычная bool было доступно как имя). На мой взгляд, решение макросов, которое они придумали, менее чем идеальное, и, действительно, довольно редко можно увидеть код C, который использует булевы типы, тогда как они распространены в C++.

2

C++ действительно есть bool типа, и поэтому не заморачиваться с _Bool. До C99, C не имеют тип bool; и из C99 в заголовке <stdbool.h> определен bool в виде макроса, который был расширен до _Bool.

+0

[Макро, а не typedef] (http://stackoverflow.com/questions/4767923/c99-boolean-data-type). – user2357112

+0

Это правда! Будет редактировать. – tabstop

2

У нас уже есть BOOL

bool макрос для _Bool. Вот почему у нас есть _Bool. (Называя его bool бы уже сломанный код, который уже используется имя;. _Bool меньше шансов столкнуться с чем-либо)

+2

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

5

_Bool в C не имеет той же семантики, что и другие целочисленные типы.

Например, для преобразования в целых чисел:

(_Bool) 0.5 

вычисляет 1

тогда

(int) 0.5 

вычисляется в 0.

(Это пример, приведенный Обоснованием C99 для типа _Bool).

+0

Знаете ли вы о хорошем источнике информации, описывающем полную семантику? – Dolda2000

+0

@ Dolda2000 Я не знаю, лучше всего смотреть на Стандарт напрямую. – ouah

+0

@ Dolda2000 Еще одна вещь с '_Bool', которую вы не могли бы сделать с основными целыми типами C89, -' (_Bool) integer_value' является сокращением для '!! integer_value'. – ouah

Смежные вопросы