Почему `true` и` false` считаются переменными? - PullRequest
0 голосов
/ 29 сентября 2018

Я новичок в C ++ (и довольно плохо знаком с программированием в целом), и я читал книгу о колледже C ++ («Начинаем с C ++ Early Objects», 9-е издание Гаддиса, Уолтерса и Муганды), когда наткнулся на заметку отип данных bool.

"ПРИМЕЧАНИЕ: обратите внимание, что true и false не имеют кавычек вокруг них. Это потому, что они являются переменными, а не строками."

Теперь из того, что яузнал, переменные могут быть изменены.Я понимаю, что переменная типа данных bool будет переменной, но почему true и false считаются переменными?

Насколько я понимаю, false хранится как целочисленное значение 0 и true как целочисленное значение 1.Я попытался присвоить значения x, где x - это 0<x<0 для bool, и все они вывели 1, что заставило меня прийти к выводу, что true - это также все, кроме 0 (другими словами, trueэто то же самое, что и !false?).

Так что, если это так, почему «ложь» считается переменной, а не константой?

1 Ответ

0 голосов
/ 29 сентября 2018

Вы используете книгу, которая показывает явное непонимание предмета автором.Эта книга лжет вам.Бросьте его в корзину.

true и false являются логическими литералами: они представляют собой простой способ записать значение типа bool."true" и "false" являются строковыми литералами - и, к сожалению, C ++ может помочь вам выстрелить себе в ногу, преобразовав их в их адрес, а затем в логический тип.Итак, вы получите этот замечательный самородок:

bool b1 = "false"; // string contents don’t matter
assert(b1 == true);
using book = bool;
book b2 = false;
assert(b2 == false);

Утверждения - это способ написания истинных утверждений в коде: они означают, что в момент их появления условие в скобках должно быть истинным.

true и false хранятся любым способом, который пожелает компилятор - это подробности реализации и стандарт здесь не предъявляет никаких требований, за исключением true необходимости преобразования в 1 в числовом контексте иfalse необходимо преобразовать в 0 там.Обычно они хранятся не в виде целых чисел, а в байтах (char), т.е.

assert(sizeof(int) > sizeof(bool));
...