Що стосується булевого типу в С
Булевський тип був введений досить пізно мовою С, в 1999 році. До цього C не мав булевого типу, а натомість використовувався int
для всіх булевих виразів. Тому всі логічні оператори, такі як > == !
etc, повертають int
значення 1
або0
.
У додатках було звичайно використовувати домашні типи, такі як typedef enum { FALSE, TRUE } BOOL;
, яке також зводиться до int
-розмірних типів.
C ++ мав набагато кращий і явніший булівський тип bool
, який був не більший за 1 байт. У той час як булеві типи або вирази в C в гіршому випадку закінчуються як 4 байти. Деякий спосіб сумісності з C ++ був введений в C зі стандартом C99. Потім C отримав булевий тип, _Bool
а також заголовок stdbool.h
.
stdbool.h
забезпечує деяку сумісність із C ++. Це заголовок визначає макрос bool
(те саме написання, що і ключове слово C ++), який розширюється на _Bool
тип, який є малим цілим типом, ймовірно, на 1 байт. Крім того , заголовок містить два макроси true
і false
, таке ж написання , як ключові слова C ++, але зі зворотним сумісністю з більш старими програмами C . Тому true
і false
розширюватися 1
і 0
в C і їх типint
. Ці макроси насправді не бульового типу, як відповідні ключові слова C ++.
Аналогічно, для цілей зворотної сумісності логічні оператори в C досі повертають a int
донині, незважаючи на те, що C нині набув булевого типу. Перебуваючи в C ++, логічні оператори повертають a bool
. Таким чином, такий вираз sizeof(a == b)
дасть розмір а int
в С, але розмір а bool
в С ++.
Щодо умовного оператора ?:
Умовний оператор ?:
- дивний оператор з парою примх. Поширена помилка вважати, що це 100% еквівалентно if() { } else {}
. Не зовсім.
Між оцінкою 1-го та 2-го або 3-го операндів існує точка послідовності. ?:
Оператор гарантовано тільки оцінити або 2 - го або 3 - го операнда, тому він не може виконати будь - які побічні ефекти операнда, що не оцінюється. Код як би true? func1() : func2()
не виконується func2()
. Все йде нормально.
Однак існує спеціальне правило, яке вказує на те, що 2-й і 3-й операнди повинні неявно набирати тип і сприяти їх рівновазі звичайними арифметичними перетвореннями . ( Неявні правила просування типу в C пояснюються тут ). Це означає, що 2-й або 3-й операнд завжди буде принаймні таким же великим, як і int
.
Отже, це не має значення, true
і false
, мабуть, має тип int
C, оскільки вираз завжди надаватиме принаймні розмір int
значення.
Навіть якби ви переписали вираз до нього, він все одно поверне розмір !sizeof(a ? (bool)true : (bool)false)
int
Це відбувається через неявне просування типу за допомогою звичайних арифметичних перетворень.
sizeof(true)
аsizeof(false)
також 4: ide.geeksforgeeks.org/O5jvuN