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

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

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

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

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

4 ответов


int x = 4<5;

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

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

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


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

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

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

макрос bool расширяется _Тип bool.

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


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

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

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

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


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

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


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