Printf для спецификатора _Bool?

С printf() я могу использовать %hhu для unsigned char, %hi для short int, %zu для size_t, %tx для ptrdiff_t и т.д.

Какой спецификатор формата преобразования я использую для _Bool? Существует ли в стандарте?

Или мне нужно сделать это следующим образом:

_Bool foo = 1;
printf("foo: %i\n", (int)foo);

Ответ 1

Для типа _Bool не существует специального модификатора длины преобразования.

_Bool - это целочисленный тип без знака, достаточно большой для хранения значений 0 и 1. Вы можете напечатать _Bool следующим образом:

_Bool b = 1;
printf("%d\n", b);

Из-за правил целых рекламных кампаний _Bool гарантированно продвигается до int.

Ответ 2

До C99, bool не был отделен стандартом C и, следовательно, не существовал как модификатор printf. C99, определенный _Bool (который вы используете) должен быть целым числом, поэтому вы должны отличать его как целое число для отображения (по крайней мере, с точки зрения машины). Кроме того, вы можете сделать что-то вроде:

printf("%d",foo?1:0);

Ответ 3

Как вы отметили в комментарии к @Jack, "6.3.1.1p1 говорит, что ранг преобразования _Bool меньше ранга всех других стандартных целочисленных типов".

При вызове printf a char или short будет продвигаться и передаваться в стеке как int (или unsigned int), поэтому я думаю, что используя %d as спецификатор формата будет в порядке. Это также означает, что вам не требуется явное преобразование в int, потому что это произойдет автоматически.

Единственная возможная проблема заключается в том, как компилятор представляет _Bool, то, что он, вероятно, определен в реализации и может варьироваться от одного компилятора к другому. Я вижу две вероятные реализации - 0 и 1 или 0 и -1.

Для обеспечения максимальной переносимости выполните команду @user325181 и используйте тройной выбор между двумя параметрами. Либо целые числа (которые компилятор может оптимизировать), либо строки.

Изменить: как сообщается в других ответах, a _Bool определяется как неподписанный тип интеграла, который может хранить 0 или 1. Из-за этого и того факта, что он будет повышен до unsigned int, когда он передан в printf(), я бы сказал, что %u %d является наиболее подходящим спецификатором.

Ответ 4

Нет. Просто обрабатывайте его как int с помощью спецификатора %d или %i.

_Bool

В C99 новое ключевое слово _Bool вводится как новый тип boolean. Во многих аспектах он ведет себя так же, как беззнаковый int, но конверсии от других целых типов или указателей, всегда ограниченных 0 и 1. За исключением других типов без знака, и, как можно было бы ожидать, для boolean, такое преобразование равно 0 тогда и только тогда, когда выражение в вопрос оценивается в 0 и равен 1 во всех остальных случаях. Заголовок stdbool.h предоставляет макросы bool, true и false, которые определены как _Bool, 1 и 0 соответственно.

Первый способ реализовать это, исходящий из соображений, заключается в использовании char или (int8_t) a enum и bit fields. Но на самом деле это зависит. Это может быть typedef для int (как я уже упоминал, он использовался, но не рекомендуется, с учетом ошибок) или char или unsigned int, или перечисление и #define, которые обычно используются.

Например, реализация Apple использует int, как вы можете видеть:

#ifndef _STDBOOL_H_
#define _STDBOOL_H_ 

#define __bool_true_false_are_defined   1

#ifndef __cplusplus

#define false   0
#define true    1

#define bool    _Bool
#if __STDC_VERSION__ < 199901L && __GNUC__ < 3
typedef int _Bool;
#endif

#endif /* !__cplusplus */

#endif /* !_STDBOOL_H_ */

Другие реализации:

typedef int8_t _Bool;

typedef enum { false = 0, true = 1 } bool;

typedef unsigned char Boolean; typedef _Bool Boolean;

Ответ 5

Я использую %b для спецификатора преобразования Java printf(). Я попробовал это недавно, и, к моему удивлению, это сработало.

Вот строка кода:

System.out.printf("firstRobot == secondRobot: %b",firstRobot == secondRobot);

Вот результат:

firstRobot == secondRobot: false