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

79

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

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

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

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

  • 0
    Почему бы тебе не изменить первое выражение? Вы можете написать assert(x!=0) . Даже если bool (true) конвертирует portable в int (1), утверждение «не ложно» имеет более читаемое выражение.
  • 0
    Почему нет: assert( 4 < 5); и assert(!( 4 > 5));
Показать ещё 4 комментария
Теги:
c99

4 ответа

130
Лучший ответ
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, [..]

  • 3
    уверен, что в C с 1999 года есть bool . Просто используйте заголовок "stdbool.h", и это должно быть включено.
  • 0
    @Jens: я этого не знал. Позвольте мне обновить мой ответ.
Показать ещё 3 комментария
35

Вы одновременно отметили свой вопрос [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) независимо от версии спецификации языка.

  • 4
    +1 за принятие во внимание как C, так и C ++.
  • 2
    Правильно, в K & R C. нет никакого bool. Я пометил свой вопрос как C99.
Показать ещё 7 комментариев
16

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

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

  • 0
    Спасибо за ссылку. Кажется, что это правда == 1 по историческим причинам.
2

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

  • 1
    Спасибо, что нашли время и протестировали.
  • 1
    «В некоторых случаях это работает» - не очень хороший способ проверить правильность, особенно с неуказанными версиями этих инструментов. Я предпочитаю подход в других ответах; они не могут гарантировать, что конкретная реализация верна, но они могут гарантировать, что будет делать правильная реализация.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню