Bool to int conversion

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

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

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

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

Ответ 1

int x = 4<5;

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

В §4.7/4 из стандарта С++ говорится (интегральное преобразование)

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


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

EDIT: Jens в комментарии сказал: C99 имеет тип _Bool. bool - макрос, определенный в заголовочном файле stdbool.h. true и false также определяются макросом в stdbool.h.

В §7.16 из C99 говорится:

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

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

Ответ 2

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

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

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

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

Ответ 3

В разделе 6.5.8.6 стандарта C говорится:

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

Ответ 4

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