与printf()
,我可以使用%hhu
为unsigned char
, %hi
一个short int
, %zu
用于size_t
, %tx
用于ptrdiff_t
等
应怎样使用转换格式指定为_Bool
? 难道一个标准存在吗?
还是我投它是这样的:
_Bool foo = 1;
printf("foo: %i\n", (int)foo);
与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
。
直到C99,布尔不是开标准的C,并且因此不存在作为一个printf改性剂。 C99,定义_Bool(其使用的是)是一个整数,因而你应该罚款铸造它作为一个整数(从机器透视至少)显示。 或者,你可以这样做:
printf("%d",foo?1:0);
当你在一个注释@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
是最合适的符。
没有。 只要处理它像一个int
使用%d
或%i
符。
_Bool
在C99中,一个新的关键字,_Bool,被引入作为新的布尔类型。 在许多方面,它的行为就像一个unsigned int,但是从其他整数类型或指针转换始终限制为0和1比对其他无符号类型其他,正如人们所期望为布尔型,这样的转换是0,如果且仅当有问题的表达式的计算结果为0,这是在所有其他情况下1。 头stdbool.h提供宏布尔,真假被定义为_Bool,1和0分别。
实现它是来自成脑海的第一个方法是使用一个char
或( int8_t
)的enum
,并与bit fields
。 但实际上,这要看情况。 它可以是一个typedef
为int
(正如我所提到的,它的使用,但不建议,受到错误)或char
或unsigned int
或枚举和#define
,通常用于。
对于exampe, 苹果实现使用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;
我用%b
为Java printf()
转换符。 最近,我试了一下,让我惊讶它的工作。
下面是代码行:
System.out.printf("firstRobot == secondRobot: %b",firstRobot == secondRobot);
下面是输出:
firstRobot == secondRobot: false