Joã*_*ulo 1 c++ casting boolean
我有以下代码:
#include <iostream>
void f(void* buffer) {
int x = static_cast<bool>(*(char*)buffer);
int y = static_cast<bool>(*(bool*)buffer);
std::cout << x << " " << y;
}
int main() {
int a = 255;
f(&a);
}
Run Code Online (Sandbox Code Playgroud)
在GCC 9.1上,我得到以下输出:
1255
在这种情况下,为什么将强制转换bool为(char*)强制转换结果x为1,并将强制强制转换bool为(bool*)强制转换结果y为255?
为什么用(bool *)强制转换为bool ...?
因为程序的行为是不确定的。
标准说(引用最新草案):
[basic.lval]
如果程序试图通过glvalue访问对象的存储值,该glValue的类型与以下一种类型不相似([conv.qual]),则行为未定义:
- 对象的动态类型,
- 类型是与对象的动态类型相对应的有符号或无符号类型,或者
- 字符,无符号字符或std :: byte类型。
bool与动态类型不同buffer,既不是也不unsigned是unsigned对应类型,也不是char unsigned char或std::byte。因此,行为是不确定的。
为什么用(char *)强制转换为布尔值会导致x为1
因为的第一个字节a包含一个不代表零的值。是否会这样取决于CPU体系结构。整数的字节顺序由实现定义。
请注意,在这种情况下,行为将得到很好的定义,因为char在引用的规则中将其列为例外之一。
| 归档时间: |
|
| 查看次数: |
99 次 |
| 最近记录: |