Насколько переносимым является это преобразование. Могу ли я быть уверенным, что оба утверждения проходят?
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, ни на С++.