使用printf()
,我可以%hhu
使用unsigned char
,%hi
使用short int
,%zu
使用size_t
,%tx
等ptrdiff_t
等。
我对_Bool
使用什么转换格式说明符?标准中是否存在一个?
或者我必须像这样投射:
_Bool foo = 1;
printf("foo: %i\n", (int)foo);
答案 0 :(得分:11)
_Bool
类型没有特定的转换长度修饰符。
_Bool
是无符号整数类型,足以存储值0
和1
。您可以这样打印_Bool
:
_Bool b = 1;
printf("%d\n", b);
由于整数促销规则,_Bool
保证会提升为int
。
答案 1 :(得分:6)
直到C99,bool不是标准C的分开,因此不作为printf修饰符存在。 C99,定义_Bool(你正在使用)是一个整数,因此你应该把它作为一个整数来展示(至少从机器的角度来看)。或者,您可以执行以下操作:
printf("%d",foo?1:0);
答案 2 :(得分:2)
正如你在对@Jack的评论中所述,“6.3.1.1p1表示转换等级_Bool
小于所有其他标准整数类型的等级”。
在致电printf
时,char
或short
将被提升并作为int
(或unsigned int
)在堆栈上传递,所以我认为使用%d
作为格式说明符会很好。这也意味着您不需要显式转换为int
,因为这会自动发生。
唯一可能的问题是编译器如何表示 _Bool
,它可能是实现定义的,并且可能因编译器而异。我看到两个可能的实现 - 0和1或0和-1。
为了获得最佳的便携性,请关注@ user325181的答案并使用三元组在两个选项之间进行选择。整数(编译器可以优化掉)或字符串。
编辑:正如在其他答案中所报告的那样,_Bool
被定义为可以存储0或1的无符号整数类型。因此,以及它将被提升为 { {1}} unsigned
传递给int
时,我会说 printf()
%u
是最合适的说明符。< / p>
答案 3 :(得分:1)
没有。只需使用int
或%d
说明符,就像%i
一样处理它。
在C99中,引入了一个新的关键字_Bool作为新的布尔类型。 在许多方面,它的行为很像unsigned int,但转换 从其他整数类型或指针始终约束为0和1。 除了其他未签名的类型,并且正如人们期望的那样 boolean类型,当且仅当表达式在,这样的转换为0 问题评估为0,在所有其他情况下为1。标题 stdbool.h提供定义为的宏bool,true和false _Bool,分别为1和0。
实现它的第一种方法是使用char
或(int8_t
)enum
和bit fields
。但实际上,这取决于。对于typedef
,它可以是int
(正如我所提到的,它已被使用,但不建议使用,可能存在错误)或char
或unsigned int
或枚举和#define
这是常用的。
例如,Apple's implementation使用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_ */
其他实施:
答案 4 :(得分:0)
我将%b
用于Java printf()
转换说明符。我最近尝试过,令我惊讶的是它有效。
以下是代码行:
System.out.printf("firstRobot == secondRobot: %b",firstRobot == secondRobot);
这是输出:
firstRobot == secondRobot: false