为什么bool和not bool在这种情况下都返回true
Why does bool and not bool both return true in this case?
这是我的代码:
#include <cstring>
#include <iostream>
int main() {
bool a;
memset(&a, 0x03, sizeof(bool));
if (a) {
std::cout << "a is true!" << std::endl;
}
if (!a) {
std::cout << "!a is true!" << std::endl;
}
}
它输出:
a is true!
!a is true!
似乎bool
上的!
运算符只反转最后一位,但每个不等于0
的值都被视为true
。这导致了所显示的行为,这在逻辑上是错误的。这是实现中的错误,还是规范允许这样做?请注意,memset
可以省略,并且行为可能是相同的,因为a
包含内存垃圾。
我使用的是gcc 4.4.5,其他编译器可能会有不同的做法。
标准(3.9.1/6基本类型)规定:
布尔类型的值为true或false。
以本国际标准中描述为"未定义"的方式使用布尔值,例如通过检查未初始化的自动对象,可能会导致它的行为看起来既不是true也不是false。
您的程序使用memset
会导致未定义的行为。其结果可能是该值既不是真也不是假。
这不是"逻辑错误",而是未定义的行为。假定bool
仅包含true
或false
这两个值中的一个。为其赋值将导致转换为其中一个值。通过在内存顶部写入任意字节值(或者,正如您所提到的,让它不被理解)来破坏类型安全性是不会的,所以您很可能最终得到一个既不是true
也不是false
的值。
在内部,它可能使用逐位not(~
运算符)来反转它,当bool为零或全为1时,这将起作用:
a = 00000000 (false)
!a = 11111111 (true)
但是,如果您将其设置为三:
a = 00000011 (true)
!a = 11111100 (also true)
相关文章:
- 让bool方法返回其他整数
- 返回 bool 作为 CPP 中 bool 运算符 [] 中的值
- 为什么"std::set::erase(const key_type&)"返回"size_type"而不是"bool"?
- 返回"Cannot convert from 'std::ofstream {aka std::basic_ofstream<char>}' to bool"错误
- 尝试创建一个评估字符的bool函数,如果字母数字为字母,则返回true
- C++ bool 数组返回 1 或 0 以外的值
- C :Bool方法在COUT语句之后返回意外数字
- 我的bool函数一直返回true,我不知道为什么
- 返回 std::p air<const CustomClass &, bool> 用于搜索函数中的失败情况,当 CustomClass 是抽象基类时
- 功能模板专业化中的bool返回值
- 在C 中返回bool的功能
- 显式布尔操作员 - 无法返回,测试,初始化bool
- 为什么 std::fstream 返回 void 而不是 bool
- 如何处理失败的方法:通过使用异常或使方法返回bool
- 如果删除,如何返回 true,如果不使用 bool,则返回 false
- VS2012 std::函数运算符 bool 意外返回 true
- C++返回的bool总是false
- 从 Vector 返回 bool&
- C++Bool返回十六进制Int
- c++ bool返回0 1而不是true false