bool тип данных в языке Си.
В языке Си нет типа данных bool и значений true и false.
В заголовочном файле определены макросы bool, true и false, которые позволяют использовать синтаксис аналогичный языку C++.
#include // prinf() #include // bool, true, false int main() < int counter = 0; bool flag = true; while(flag)< if(counter == 5)< flag = false; >printf("counter = %d, flag = %d \n", counter, flag); counter++; > return 0; >
Значение true = 1, а false = 0. Оператор if выполняется при любом ненулевом значении в скобках оператора.
#include // printf() #include // true, false int main() < printf("true = %d, false = %d \n", true, false); // true = 1, false = 0 if(-1)< // Будет выведено "only 0 == false" printf("only 0 == false \n"); // Любое ненулевое значение это true (срабатывание if) >>
Понравилась страница?
Добавить в закладки
Или поделиться!
тип bool в C
Не могу понять, что происходит с типом bool. пустая прога:
при компиляции gcc выдает:
test.c: in function ‘main’: test.c:3: ‘bool’ undeclared (first use in this function) test.c:3: (Each undeclared identifier is reported only once test.c:3: for each function it appears in.) test.c:3: parse error before ‘bval’
Что, нет такого типа ‘bool’.
CyberCoder ★
28.02.03 23:14:43 MSK
Прикинь, и в самом деле нет.
anonymous
( 01.03.03 00:03:01 MSK )
Типа bool в С действительно нет. Точнее, в версиях стандарта до C99 его действительно нет. В С99 он есть, но называется _Bool. Кроме того, определен заголовочный файл в котором определен `bool’ как синоним для _Bool. Сделано это было, чтобы не нарушать совместимость с существующим кодом. GCC поддерживает С99 в этом отношении. Однако особого смысла в использовании _Bool/bool я не вижу, т.к. в плане проверки типов это обычный целочисленный тип (совместимый по присваиванию с int и так далее). Единственная особенность — явное приведение к _Bool дает всегда либо 0 либо 1 (это, однако, не означает, что переменная типа _Bool будет занимать в памяти один бит) — точно такой же эффект может быть достигнут при помощи `!!’
aa5779 ★
( 01.03.03 01:47:58 MSK )

А не проще писать так?
#define TRUE 1
#define FALSE 0
Ну и для полной радости
typedef unsigned short bool;
OxiD ★★★★
( 01.03.03 13:27:18 MSK )
Ответ на: комментарий от OxiD 01.03.03 13:27:18 MSK
short занимает 2 байта, может быть вместо него использовать char?
CyberCoder ★
( 01.03.03 14:48:37 MSK ) автор топика
Компилятор при сравнениях и прочих операциях будет приводить char к int, так что ты выиграешь (может быть) в памяти, но проиграешь (какие-то копейки) в скорости.
Конструкция
typedef enum bool;
будет лучше (IMHO), чем #define.
nobody ★★
( 01.03.03 15:10:04 MSK )
Ответ на: комментарий от nobody 01.03.03 15:10:04 MSK
я понял, спасибо за ответы
CyberCoder ★
( 01.03.03 15:30:16 MSK ) автор топика

Oxid ты уверен что 0 - это false? мне кажется что должно быть что то типа #define TRUE (1 == 1) #define FALSE (!TRUE) typedef enum bool; может не прокатить в конструкции while (!false) < /* XXX */ >т.к. enum не обязан начинаться с 0 да и я не уверен что 0 это на самом деле false
lg ★★
( 02.03.03 11:19:32 MSK )
Ну здрасьте, всегда в условиях проверяли числа и указатели на 0 просто if(!number) а тут оказывается false!=0. приехали.
anonymous
( 02.03.03 17:00:58 MSK )
> enum не обязан начинаться с 0
Согласно стандарту языка Си, первый элемент перечисления по умолчанию равен 0.
> я не уверен что 0 это на самом деле false
Если использовать конструкцию
enum ;
то слово false будет синонимом числа 0.
Во всяком случае, компилятор, встретив false, будет заменять его на 0 (а true — на 1).
Тип у обоих будет int.
Вот пример:
Функция, написанная программером:
bool fn(bool arg)
<
if (arg) do_something();
else do_nothing();
return true;
>
Та же функция, но с точки зрения компилятора:
int fn(int arg)
<
if (arg != 0) do_something();
else do_nothing();
return 1;
>
Вобщем, разница между использованием int в диапазоне от 0 до 1 и использованием bool от false до true заключается только в читабельности программы. Если в программе есть немалое количество функций, возвращающих только успешность выполнения (да/нет), то есть смысл (IMHO) использовать для этих целей bool — для лучшей читаемости. То же самое справедливо и для аргументов функций.
nobody ★★
( 02.03.03 17:50:01 MSK )
Плохо не то что false == 0, а то что true == 1; Значит проверки на x == true будут проваливаться для большинства случаев.
В C нет булевского типа — лучше с этим смириться и вести себя соответсвенно, а не смущать народ.
anonymous
( 02.03.03 19:13:19 MSK )
> Значит проверки на x == true будут проваливаться
> для большинства случаев
int main()
<
if (fn() != true) puts(«anonymous прав»);
return 0;
>
Если функция возвращает либо false, либо true, все будет работать.
Если функция возвращает char *, то fn() == true работать не будет.
Но то же самое верно и для Си++.
При чем здесь «В C нет булевского типа — лучше с этим смириться и вести себя соответсвенно, а не смущать народ»?
nobody ★★
( 02.03.03 21:16:00 MSK )
> Если функция возвращает char *, то fn() == true работать не будет.
Именно. Догадайтесь почему. (Правильный ответ — нет встроенного преобразования char* -> bool, т.к.»В C нет булевского типа» )
> Но то же самое верно и для Си++.
При чем здесь это? Кстати и в С++ bool не слишком нужен. (Я не имею в виду vector).
> При чем здесь «В C нет булевского типа — лучше с этим смириться и вести себя соответсвенно, а не смущать народ»?
Проверки типа ‘!= NULL’, ‘== FALSE’, ‘== TRUE’ в С не только бесполезны, но и вредны. Тот кто их применяет — напрашивается на неприятности сам и делает код менее читаемым для окружающих.
anonymous
( 02.03.03 21:37:36 MSK )
2nobody К тому же вы передергиваете. Сравните bool fn() int main() < if (fn() != true) puts("anonymous прав"); return 0; >и bool fn() < return 45; >main() < if(fn() == true) puts("nobody стопудово прав"); return 0; >(typedef enum bool; подразумевается) anonymous (*) (2003-03-02 21:37:36.281)
anonymous
( 02.03.03 22:00:04 MSK )
false == 0
frue == не 0 (любое число != 0)
anonymous
( 03.03.03 06:50:21 MSK )
Предпоследнему anonymous.
Похоже, имеет место непонимание друг друга.
Пример.
/* При успешном выполнении функция возвращает 1. */
/* При ошибке — 0. */
int fn(const char *filename)
<
if (some_condition) return 0;
/*. */
if (another_condition) return 0;
/*. */
return 1;
>
int main(int argc, char *argv[])
<
if (!fn(argv[1])) return 1;
/*. */
return 0;
>
Так вот, функция fn может в данном случае выглядеть так:
bool fn(const char *filename)
<
if (some_condition) return false;
/*. */
if (another_condition) return false;
/*. */
return true;
>
При этом отпадает необходимость такого комментария:
/* При успешном выполнении функция возвращает 1. */
/* При ошибке — 0. */
для каждой подобной функции.
Если такая функция одна, то не стоит и огород городить.
А если их два десятка, то программа (IMHO) будет читаться легче — потому что достаточно взглянуть на объявление функции в файле .h, чтобы понять, что она возвращает. Если же функция объявлена как возвращающая int, то придется лезть в файл .c, чтобы почитать комментарий — ведь функция, возвращающая int, может вернуть не только признак успешного/ошибочного выполнения, но и вообще все, что угодно — например, дескриптор открытого файла. Функция же, возвращающая bool, может вернуть только признак успешности своего выполнения — во всяком случае, так подразумевается читающим программу.
А ты в своем примере (с fn() == 45) нарушаешь общепринятые правила: объявляешь функцию так, будто она возвращает значение перечислимого типа, а на самом деле она возвращает другое.
Вот поясняющий пример:
int main()
<
static const char c[] = «123»;
putchar(c[fn()]);
puts(«segfault почему-то не случился»);
return 0;
>
nobody ★★
( 03.03.03 13:58:12 MSK )
> Похоже, имеет место непонимание друг друга. Да похоже. > Пример. > > /* При успешном выполнении функция возвращает 1. */ > /* При ошибке - 0. */ > int fn(const char *filename) > < >if (some_condition) return 0; > /*. */ > if (another_condition) return 0; > /*. */ > return 1; > > Не проще ли указать, что: 0 - в случае ошибки не 0 - в случае успеха. > int main(int argc, char *argv[]) > < >if (!fn(argv[1])) return 1; > /*. */ > return 0; > > Забегая вперед .Опять !fn. Если применяешь символические константы, то проверяй как fn() == false или fn() != true, иначе зачем ты их вообще определял? > Так вот, функция fn может в данном случае выглядеть так: > > bool fn(const char *filename) > < >if (some_condition) return false; > /*. */ > if (another_condition) return false; > /*. */ > return true; > > Это читается только после того как найдешь определения true и false. > При этом отпадает необходимость такого комментария: > > /* При успешном выполнении функция возвращает 1. */ > /* При ошибке - 0. */ И появляется необходимость в таком комментарии: /* При успешном выполнении функция возвращает true. */ /* При ошибке - false. */
anonymous
( 03.03.03 15:01:01 MSK )
Ответ на: комментарий от nobody 03.03.03 13:58:12 MSK
> Для каждой подобной функции. > Если такая функция одна, то не стоит и огород городить. > А если их два десятка, то программа (IMHO) будет читаться легче -- > потому что достаточно взглянуть на объявление функции в файле .h, > чтобы понять, что она возвращает. IMHO нет. Возвращаемые значения как раз и должны указываться в комментария в header'е. > Если же функция объявлена как возвращающая int, то придется лезть в > файл .c, чтобы почитать комментарий -- ведь функция, возвращающая > int, может вернуть не только признак успешного/ошибочного > выполнения, но и вообще все, что угодно -- например, дескриптор > открытого файла. В любом случае придется договариваться какие возвращаемые значения сигналят об ошибке. > Функция же, возвращающая bool, может вернуть только признак > успешности своего выполнения -- во всяком случае, так > подразумевается читающим программу. Разумно. > А ты в своем примере (с fn() == 45) нарушаешь общепринятые правила: > объявляешь функцию так, будто она возвращает значение перечислимого > типа, а на самом деле она возвращает другое. Странно, а компилятор мне на это не указал :( Может быть правила не такие уж общепринятые? > Вот поясняющий пример: > > typedef enum e; > > e fn() > > int main() > < >static const char c[] = "123"; > putchar(c[fn()]); > puts("segfault почему-то не случился"); > return 0; > > Segmentation fault. В Си нет диапазонных типов.
Логический тип в C++
В языке С++ для логических значений существует специальный тип — bool.
Допустимыми значениями этого типа являются только true и false, при этом других значений у переменной данного типа быть не может.
Переменная типа bool занимает в памяти ровно 1 байт.
bool b;
cout << sizeof(b); //выведет 1
Допустимые операции
С логическими переменными можно осуществлять логические операции:
~x — логическое отрицание (НЕ)
x & y — логическое умножение (И)
x | y — логические сложение (ИЛИ)
Для типа bool стираются различия между операторами && и & , а также между || и | .
Совместимость с типом int
Тип bool совместим с типом int по присваиванию в обе стороны.
При этом true переходит в 1, false — в 0.
При обратном приведении любое число, не равное нулю — переходит в true, 0 — в false.
Если использовать bool в арифметическом выражении, то оно будет переведено в int: bool + bool = int.
Надо понимать, что в С++ логический и целочисленный тип — это разные типы , поэтому по типу аргумента int и bool возможна перегрузка функций.
bool (справочник по C#)
Ключевое слово типа bool — это псевдоним для типа структуры System.Boolean .NET, представляющий логическое значение: true или false .
Для выполнения логических операций со значениями типа bool используйте логические операторы. Тип bool является типом результата операторов сравнения и равенства. Выражение bool может быть управляющим условным выражением в операторах if, do, while и for и условном операторе ?: .
Значение по умолчанию для типа bool — false .
Литералы
Вы можете использовать литералы true и false для инициализации переменной bool или передачи значения bool :
bool check = true; Console.WriteLine(check ? "Checked" : "Not checked"); // output: Checked Console.WriteLine(false ? "Checked" : "Not checked"); // output: Not checked
Трехзначная булева логика
Используйте тип bool? , допускающий значение NULL, если нужно использовать трехзначную логику, например, при работе с базами данных, которые поддерживают трехзначный логический тип. Для операндов bool? предопределенные операторы & и | поддерживают троичную логику. См. подробнее о логических операторах, поддерживающих значение NULL в описании логических операторов.
Преобразования
В C# доступно только два преобразования, использующих тип bool . Это неявное преобразование в соответствующий тип bool? , допускающий значение NULL, и явное преобразование из типа bool? . Однако .NET предоставляет дополнительные методы, позволяющие выполнять преобразование в тип bool или из него. Дополнительные сведения см. в разделе о преобразовании в логические значения и из них справочника по API System.Boolean.
Спецификация языка C#
Дополнительные сведения см. в разделе Тип boolспецификации языка C#.
См. также раздел
- справочник по C#
- Типы значений
- Операторы true и false
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.