Qwertiy Asked:2022-02-16 08:49:31 +0800 CST2022-02-16 08:49:31 +0800 CST 2022-02-16 08:49:31 +0800 CST printf 中的布尔输出 772 有一个变量: bool x = true; 我想把它printf作为一个数字来驱动。显然可以做什么 printf("%d", (int)x); 但是强制转换类型有点太懒了,我想做这样的事情: printf("%hhu", x); 这也有效,因为 unsigned char 和 bool 各占 1 个字节,但标准是否允许这样的输出? c++ 1 个回答 Voted Best Answer wololo 2022-02-16T11:31:51+08:002022-02-16T11:31:51+08:00 传递给可变参数函数的未知参数受默认参数提升的约束。其实质如下: 浮点类型受浮点提升, 整数和枚举类型受整数提升(integration Promotions) expr.call/12: [...] 如果参数具有整数类型或受整数提升约束的枚举类型,或者是受浮点提升约束的浮点类型,则参数的值在打电话。这些提升称为默认参数提升。 扩展浮点类型时,类型的值将float转换为 type 的值double。转换.fpprom/1: 类型的纯右值float可以转换为类型的纯右值double。值不变。 整数展开过程的描述相当冗长,参见:conv.prom。 但是关于类型bool,在整型展开时转换为类型int,值false转换为0,值true转换为1。conv.prom/6: 类型的纯右值bool可以转换为类型的纯右值int,false变为零和true变一。 因此,bool传递给函数std::printf的类型值在被调用之前被转换为类型值int。所以可以这样渲染: bool x = true; printf("%d", x); 让我们分解打印bool转换%hhu 说明符%hhu表示该函数printf期望接收 type 的值unsigned int,它将在输出之前将其转换为 type 的值unsigned char。因为实际传递的参数类型与转换说明符不匹配(bool展开为int) bool x = true; printf("%hhu", x); 那么程序的行为是未定义的。 N1570,7.21.6.1/9: [...] 如果任何参数不是相应转换规范的正确类型,则行为未定义。 附言 语言标准不保证一个类型bool占用一个字节。expr.sizeof/1: [注1:特别是sizeof(bool),sizeof(char16_t),sizeof(char32_t), 和的值sizeof(wchar_t)是实现定义的。65 -尾注] sizeof(bool)不是必须的1。
传递给可变参数函数的未知参数受默认参数提升的约束。其实质如下:
expr.call/12:
扩展浮点类型时,类型的值将
float
转换为 type 的值double
。转换.fpprom/1:整数展开过程的描述相当冗长,参见:conv.prom。
但是关于类型
bool
,在整型展开时转换为类型int
,值false
转换为0
,值true
转换为1
。conv.prom/6:因此,
bool
传递给函数std::printf
的类型值在被调用之前被转换为类型值int
。所以可以这样渲染:让我们分解打印
bool
转换%hhu
说明符
%hhu
表示该函数printf
期望接收 type 的值unsigned int
,它将在输出之前将其转换为 type 的值unsigned char
。因为实际传递的参数类型与转换说明符不匹配(bool
展开为int
)那么程序的行为是未定义的。
N1570,7.21.6.1/9:
附言
语言标准不保证一个类型
bool
占用一个字节。expr.sizeof/1: