使用printf()
,我可以使用%hhu
来表示unsigned char
,%hi
来表示short int
,%zu
来表示size_t
,%tx
来表示ptrdiff_t
等等。
对于_Bool
类型,我应该使用哪种转换格式说明符?标准中是否存在这样的说明符?
还是我需要像这样进行强制类型转换:
_Bool foo = 1;
printf("foo: %i\n", (int)foo);
_Bool
类型没有特定的转换长度修饰符。
_Bool
是一个无符号整数类型,大小足以存储值0
和1
。您可以使用以下方式打印_Bool
:
_Bool b = 1;
printf("%d\n", b);
由于整数提升规则,_Bool
保证能够提升到int
。
_Bool b = true;
更好些。 - Jim Balter_Bool
将被提升为int
,而不是unsigned int
。为了后世留存,如果答案包含指定此行为的C99标准的参考资料,那就太好了。 - Richard Hansen在C99之前,bool不是标准的C语言类型,因此它不能作为printf格式化符存在。C99定义了_Bool(您正在使用),将其定义为整数,因此从机器的角度来看,您可以将其转换为整数进行显示。或者,您可以执行以下操作:
printf("%d",foo?1:0);
printf("foo: %s\n", foo ? "true" : "false");
其中,如果变量foo为真,则输出“true”,否则输出“false”。请注意格式不要改变,只需进行翻译。 - Jite根据你在给@Jack的评论中所述,“6.3.1.1p1说,_Bool
的转换等级低于所有其他标准整数类型的等级。”
在调用printf
时,char
或short
将被提升并作为int
(或unsigned int
)传递到堆栈上,因此我认为使用%d
作为格式说明符是可以的。这也意味着您不需要显式转换为int
,因为这将自动发生。
唯一可能出现的问题是编译器如何表示_Bool
,这可能是实现定义的,并且可能会因一个编译器而异。 我看到两个可能的实现 - 0和1或0和-1。
为了达到最大的可移植性,遵循@user325181的答案,使用三元运算符选择两个选项之一。要么是整数(编译器可以优化掉),要么是字符串。
编辑:如其他答案所述,_Bool
被定义为可以存储0或1的无符号整型。 由于它将被提升到unsigned
int
并传递给printf()
,因此我认为%u
%d
是最合适的说明符。
0
或1
以外的任何值存储到_Bool
中(6.3.1.2)。 因此,转换回int
将始终产生0
或1
(除非出现未定义行为)。 - ecatmur<stdbool.h>
中,宏false
和true
分别扩展为0
和1
。 - Keith Thompson_Bool
是一种无符号整数类型,因此-1
不可行。 - ouahint
可以表示原始类型的所有值,则该值将转换为 int
;否则,它将转换为 unsigned int
。” 由于 int
可以表示 _Bool
的所有值,因此它将被提升为 int
,而不是 unsigned int
(即使 _Bool
是无符号整数类型)。 - Richard Hansen没有。只需使用%d
或%i
说明符,像处理int
一样处理它。
实现它的第一种方式是使用在C99中,引入了一个新的关键字
_Bool
作为新的布尔类型。 在许多方面,它的行为很像无符号整数,但是从其他整数类型或指针进行的转换总是限制为0和1。 除了其他无符号类型之外,正如人们对于布尔类型所期望的那样,如果问题表达式的求值结果为0,则此类转换为0,否则为1。 头文件stdbool.h提供了宏bool、true和false,它们分别定义为_Bool、1和0。
char
或(int8_t
)一个enum
和bit fields
。但实际上,这取决于情况。它可以是typedef
为int
(如我所提到的,它被使用,但不建议,容易出现错误)或char
或unsigned int
或枚举和#define
通常使用。
例如,苹果公司的实现使用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_ */
其他实现方式:
_Bool
是C99中的关键字,在任何头文件中都找不到它的定义。在上面的苹果示例中,它为C99之前的版本定义了它。在您的其他示例中,您有一个bool
类型和一个Boolean
类型,该类型被定义为unsigned char
或_Bool
。 - tomlogic我在Java的printf()
中使用了%b
转换说明符。最近我尝试了一下,令我惊讶的是它居然起作用了。
这是代码行:
System.out.printf("firstRobot == secondRobot: %b",firstRobot == secondRobot);
这是输出结果:
firstRobot == secondRobot: false
foo
前面不需要强制转换:_Bool
默认会被转换为int
。 - Sergey Kalinichenko_Bool
绝对不是int
的typedef。_Bool
是一个关键字,它是一个独立的类型。 - Keith Thompson