преобразование bool в int - PullRequest
       44

преобразование bool в int

110 голосов
/ 20 марта 2011

Насколько переносимо это преобразование.Могу ли я быть уверен, что оба утверждения пройдены?

int x = 4<5;
assert(x==1);

x = 4>5;
assert(x==0);

Не спрашивайте почему.Я знаю, что это некрасиво.Спасибо.

Ответы [ 4 ]

175 голосов
/ 20 марта 2011
int x = 4<5;

Полностью портативный. Стандарт соответствует. bool в int неявное преобразование!

§4.7 / 4 из стандарта C ++ говорит (Integral Преобразование )

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


Что касается C, насколько я знаю, в C. нет bool (до 1999 года). Поэтому преобразование bool в int имеет значение только в C ++. В C 4<5 оценивается как int значение, в этом случае значение 1, 4>5 оценивается как 0.

РЕДАКТИРОВАТЬ: Дженс в комментарии сказал, C99 имеет тип _Bool. bool - это макрос, определенный в заголовочном файле stdbool.h. true и false также являются макросами, определенными в stdbool.h.

§7.16 из C99 говорит,

Макрос bool расширяется до _Bool.

[..] true, который расширяется до целочисленной константы 1, false который расширяется до целочисленной константы 0, [..]

44 голосов
/ 20 марта 2011

Вы отметили свой вопрос [C] и [C ++] одновременно. Результаты будут согласованы между языками, но структура ответа различна для каждого из этих языков.

На языке C ваши примеры не имеют никакого отношения к bool (это относится и к C99). В языке C реляционные операторы не дают bool результатов. И 4 > 5, и 4 < 5 являются выражениями, которые производят результаты типа int со значениями 0 или 1. Таким образом, в ваших примерах на языке C. нет никакого «преобразования bool в int».

В C ++ реляционные операторы действительно дают bool результаты. bool значения могут быть преобразованы в тип int, при этом true преобразуется в 1 и false преобразуется в 0. Это гарантировано языком.

P.S. Язык C также имеет выделенный логический тип _Bool (с псевдонимом макросов bool), и его интегральные правила преобразования по существу такие же, как в C ++. Но, тем не менее, это не относится к вашим конкретным примерам в C. Еще раз, реляционные операторы в C всегда выдают результаты int (не bool) независимо от версии спецификации языка.

17 голосов
/ 20 марта 2011

Раздел 6.5.8.6 стандарта C гласит:

Каждый из операторов <(меньше чем),> (больше чем), <= (меньше или равно к) и> = (больше или равно) выдаст 1, если указанный отношение истинно и 0, если оно false.) Результат имеет тип int.

2 голосов
/ 20 марта 2011

Кажется, нет никаких проблем, поскольку приведение типа int к bool выполняется неявно.Это работает в компиляторе Microsoft Visual C ++, GCC и Intel C ++.Нет проблем ни в C, ни в C ++.

...