преобразование 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++.