printf的转换说明符_Bool?(printf conversion specifier for

2019-07-30 04:02发布

printf() ,我可以使用%hhuunsigned char%hi一个short int%zu用于size_t%tx用于ptrdiff_t

应怎样使用转换格式指定为_Bool ? 难道一个标准存在吗?

还是我投它是这样的:

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

Answer 1:

不存在用于特定转换长度改性剂_Bool类型。

_Bool无符号整数型大到足以存储的值01 。 您可以打印_Bool是这样的:

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

由于整数促销规则, _Bool是保证促进int



Answer 2:

直到C99,布尔不是开标准的C,并且因此不存在作为一个printf改性剂。 C99,定义_Bool(其使用的是)是一个整数,因而你应该罚款铸造它作为一个整数(从机器透视至少)显示。 或者,你可以这样做:

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


Answer 3:

当你在一个注释@Jack说,“6.3.1.1p1说,转化等级_Bool低于所有其他标准整数类型的等级”。

在调用printf ,一个charshort将促进和堆栈作为传递int (或unsigned int ),所以我会认为,使用%d为格式说明就可以了。 这也意味着,你不需要显式的int ,因为这会自动发生。

唯一可能的问题是与编译器如何表示_Bool的东西,它可能实现定义的,可以改变从一个编译器到另一个。 我看到了两个可能的实现-从0到1或0和-1。

对于便携性,并关注@ user325181的答案,并使用三元两个选项之间进行选择。 任一整数(其中,编译器可以优化路程)或字符串。

编辑:正如在其他的答案报道,一个_Bool被定义为可以存储0或1。由于这个原因,而事实上,它将被提升到一个无符号整型unsigned int传递给时printf() ,我会说, %u %d是最合适的符。



Answer 4:

没有。 只要处理它像一个int使用%d%i符。

_Bool

在C99中,一个新的关键字,_Bool,被引入作为新的布尔类型。 在许多方面,它的行为就像一个unsigned int,但是从其他整数类型或指针转换始终限制为0和1比对其他无符号类型其他,正如人们所期望为布尔型,这样的转换是0,如果且仅当有问题的表达式的计算结果为0,这是在所有其他情况下1。 头stdbool.h提供宏布尔,真假被定义为_Bool,1和0分别。

实现它是来自成脑海的第一个方法是使用一个char或( int8_t )的enum ,并与bit fields 。 但实际上,这要看情况。 它可以是一个typedefint (正如我所提到的,它的使用,但不建议,受到错误)或charunsigned 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;



Answer 5:

我用%b为Java printf()转换符。 最近,我试了一下,让我惊讶它的工作。

下面是代码行:

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

下面是输出:

firstRobot == secondRobot: false


文章来源: printf conversion specifier for _Bool?