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



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



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

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


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

755   4  

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 результаты. Оба 4 > 5 и 4 < 5 - это выражения, которые дают результаты типа int значения 0 или 1. Таким образом, нет никакого "преобразования bool в int" любого рода, происходящего в ваших примерах В C.

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

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

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

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

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

Comments

    Ничего не найдено.