Boolean c что это
Перейти к содержимому

Boolean c что это

  • автор:

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, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *