_Bool的printf转换说明符?

时间:2012-06-28 17:55:42

标签: c standards printf c99

使用printf(),我可以%hhu使用unsigned char%hi使用short int%zu使用size_t%txptrdiff_t等。

我对_Bool使用什么转换格式说明符?标准中是否存在一个?

或者我必须像这样投射:

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

5 个答案:

答案 0 :(得分:11)

_Bool类型没有特定的转换长度修饰符。

_Bool无符号整数类型,足以存储值01。您可以这样打印_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时,charshort将被提升并作为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一样处理它。

_Bool

  

在C99中,引入了一个新的关键字_Bool作为新的布尔类型。   在许多方面,它的行为很像unsigned int,但转换   从其他整数类型或指针始终约束为0和1。   除了其他未签名的类型,并且正如人们期望的那样   boolean类型,当且仅当表达式在,这样的转换为0   问题评估为0,在所有其他情况下为1。标题   stdbool.h提供定义为的宏bool,true和false   _Bool,分别为1和0。

实现它的第一种方法是使用char或(int8_tenumbit fields。但实际上,这取决于。对于typedef,它可以是int(正如我所提到的,它已被使用,但不建议使用,可能存在错误)或charunsigned 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_ */

其他实施:

typedef int8_t _Bool;

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

typedef unsigned char Boolean; typedef _Bool Boolean;

答案 4 :(得分:0)

我将%b用于Java printf()转换说明符。我最近尝试过,令我惊讶的是它有效。

以下是代码行:

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

这是输出:

firstRobot == secondRobot: false