Що стосується булевого типу в С
Булевський тип був введений досить пізно мовою С, в 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, мабуть, має тип intC, оскільки вираз завжди надаватиме принаймні розмір intзначення.
Навіть якби ви переписали вираз до нього, він все одно поверне розмір !sizeof(a ? (bool)true : (bool)false) int
Це відбувається через неявне просування типу за допомогою звичайних арифметичних перетворень.
sizeof(true)аsizeof(false)також 4: ide.geeksforgeeks.org/O5jvuN