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