спецификатор преобразования printf для Bool?

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

что форматное преобразование я использовать _Bool? Нет в стандарте?

или я должен бросить его так:

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

5 ответов


нет конкретного модификатора длины преобразования для _Bool тип.

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

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

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


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

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

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

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

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

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

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


нет. Просто обращаться с ним как int С помощью %d или %i описатель.

_Bool

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

первый способ реализовать его, который приходит в голову, - это использовать char или(int8_t) an 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;


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

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

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

вот вывод:

firstRobot == secondRobot: false