Насколько переносимым является это преобразование. Могу ли я быть уверенным, что оба утверждения проходят?
int x = 4<5;
assert(x==1);
x = 4>5;
assert(x==0);
Не спрашивайте, почему. Я знаю, что это уродливо. Спасибо.
Насколько переносимым является это преобразование. Могу ли я быть уверенным, что оба утверждения проходят?
int x = 4<5;
assert(x==1);
x = 4>5;
assert(x==0);
Не спрашивайте, почему. Я знаю, что это уродливо. Спасибо.
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
, [..]
Вы одновременно отметили свой вопрос [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
) независимо от версии спецификации языка.
В разделе 6.5.8.6 стандарта C говорится:
Каждый из операторов < (меньше), > (больше), <= (меньше или равно to), и >= (больше или равно) должен дать 1, если указанный отношение истинно и 0, если оно false.) Результат имеет тип int.
Кажется, нет проблем, поскольку int to bool cast выполняется неявно. Это работает в компиляторе Microsoft Visual С++, GCC и Intel С++. Нет проблем ни на C, ни на С++.