14

有了printf(),我可以使用%hhufor unsigned char%hifor a short int%zufor a size_t%txfor aptrdiff_t等。

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

还是我必须像这样投射它:

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

5 回答 5

11

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

_Bool是一个无符号整数类型,足以存储值01. 你可以这样打印_Bool

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

由于整数提升规则,_Bool保证提升到int.

于 2012-06-28T19:12:51.800 回答
6

在 C99 之前,bool 不是标准 C 的一部分,因此不作为 printf 修饰符存在。C99,将 _Bool (您正在使用的)定义为整数,因此您应该可以将其转换为整数来显示(至少从机器的角度来看)。或者,您可以执行以下操作:

printf("%d",foo?1:0);
于 2012-06-28T18:07:23.633 回答
2

正如您在对@Jack 的评论中所说,“6.3.1.1p1 表示 的转换等级_Bool低于所有其他标准整数类型的等级”。

在对 的调用中printf,一个charor将被提升并作为一个(或一个)short在堆栈上传递,所以我认为使用作为格式说明符会很好。这也意味着您不需要显式强制转换为,因为这会自动发生。intunsigned int%dint

唯一可能的问题是编译器如何表示 a _Bool,它可能是实现定义的,并且可能因一个编译器而异。我看到了两种可能的实现——0 和 1 或 0 和 -1。

为了最终的可移植性,请按照@user325181 的回答并使用三元组在两个选项之间进行选择。整数(编译器可能会优化掉)或字符串。

编辑:正如其他答案中所报告的,a被定义为可以存储 0 或 1 的无符号整数类型。正因为如此,而且当它传递给时_Bool它会被提升为 a 的事实,我会说这是最合适的说明符。unsignedintprintf()%u%d

于 2012-06-28T19:01:30.810 回答
1

没有。只需像int使用%d%i说明符一样处理它。

_Bool

在 C99 中,引入了一个新关键字 _Bool 作为新的布尔类型。在许多方面,它的行为很像 unsigned int,但从其他整数类型或指针的转换总是被限制为 0 和 1。除了其他无符号类型,正如人们对布尔类型所期望的那样,这样的转换为 0,如果并且仅当相关表达式的计算结果为 0 并且在所有其他情况下为 1 时。头文件 stdbool.h 提供了分别定义为 _Bool、1 和 0 的宏 bool、true 和 false。

想到的第一种实现方法是使用charor( int8_t)enum和 with bit fields。但实际上,这取决于。它可以是一个typedeffor an int(正如我所提到的,它已被使用,但不推荐,受错误影响)或charunsigned 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;

于 2012-06-28T19:41:45.073 回答
0

%b用于 Javaprintf()转换说明符。我最近尝试了它,令我惊讶的是它起作用了。

这是代码行:

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

这是输出:

firstRobot == secondRobot: false
于 2013-09-22T03:35:30.827 回答