_Bool 有“printf”转换说明符吗?

问题描述 投票:0回答:5

使用

printf()
,我可以使用
%hhu
表示
unsigned char
,使用
%hi
表示
short int
,使用
%zu
表示
size_t
,使用
%tx
表示
ptrdiff_t
,等等

我对

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

或者我必须像这样投射它:

_Bool foo = 1;
printf("foo: %i\n", (int)foo);
c standards printf c99
5个回答
12
投票

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

_Bool
是一个 unsigned 整数类型,足够大以存储值
0
1
。您可以这样打印
_Bool

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

由于整数晋升规则,

_Bool
保证晋升为
int


6
投票

直到 C99,bool 还不是标准 C 的一部分,因此不作为 printf 修饰符存在。 C99,将 _Bool (您正在使用的)定义为整数,因此您应该将其精细地转换为整数来显示(至少从机器角度来看)。或者,你可以这样做:

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

2
投票

正如您在对 @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
是最合适的说明符。


1
投票

没有。只需使用

int
%d
说明符像
%i
一样处理它。

_Bool

在C99中,引入了一个新关键字_Bool作为新的布尔类型。 在许多方面,它的行为很像 unsigned int,但是转换 其他整数类型或指针始终限制为 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

例如,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;


0
投票

我使用

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

这是代码行:

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

这是输出:

firstRobot == secondRobot: false
© www.soinside.com 2019 - 2024. All rights reserved.