Суммирование значений bool в C / C ++ - PullRequest
6 голосов
/ 05 октября 2011

Рассмотрим код C ++, приведенный ниже:

bool a = 5;
bool b = 6;
int c = (int)a + (int)b;

Когда я компилирую и запускаю этот код, c имеет значение 2. Гарантирует ли стандарт, что в любом компиляторе / платформе значения bool, инициализированные false (0) или true (не обязательно 1), будут равны 1 в операциях и коде выше всегда приведет к 2?

А в C99, включая stdbool.h, это все еще действует?

Ответы [ 4 ]

10 голосов
/ 05 октября 2011

Раздел 4.7 (целочисленные версии) стандарта C ++ гласит:

Если тип источника bool , значение false преобразуется в нольи значение true преобразуется в единицу.

Раздел 4.9 дает такую ​​же гарантию для преобразований с плавающей запятой.

1 голос
/ 06 октября 2011

Дэвид Шварц уже отвечал за C ++. Для стандарта C99 у нас есть 6.3.1.4:

Когда любое скалярное значение преобразуется в _Bool, результат равен 0, если значение сравнивается равным 0; в противном случае результат равен 1.

Поскольку в 6.3.1.1 стандарта также четко указано, что _Bool подлежит целочисленным повышениям, ясно, что _Bool всегда будет либо 0, либо 1.

1 голос
/ 05 октября 2011

Согласно стандарту:

  • true конвертируется в 1
  • false конвертируется в 0

И он приводит к int не обязательно, поскольку преобразование в int неявно.

1 голос
/ 05 октября 2011

Для компиляторов правило, что false равно 0, и все остальное будет верным.Тем не менее, обращение к bool как целочисленному типу обычно считается плохой формой.Стандарт, однако, включает в себя правило для преобразования в int, и вы предполагаете, что правильно false = 0 и true = 1, если компилятор придерживается стандарта!

В любом случае, почему арифметика с типами bool?

Надеюсь, что эта помощь

...