作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个关于按位非
和逻辑非
的问题,希望有人能为我解答。
所以我知道以下作品:
!true == false
!false == true
我认为按位非
可以做同样的事情,但它显然不能。
假设我有一个 boolean 值:
bool test = true;
然后当我打印出 ~test
时,输出为 true
。
如果 boolean 值是
bool test = false;
然后当我打印出 ~test
时,输出为 true
,这是预期的。但是,当我再次执行 ~test
时,它不会返回到 false
。
由于某些原因,按位非
不能将 boolean 值从true
翻转为false
。
有人对此有答案吗?
最佳答案
根据 C++ 标准 ([expr.unary.op]) 的 §5.3.1.10,~
运算符采用整数(或无作用域枚举类型)操作数并执行整数提升,其中 ~
的结果类型operation 是其提升的操作数的类型。这意味着 boolean 值首先被转换为整数( 0
为 false
和 1
为 true
)。由于您的上下文,~
的结果然后将操作转换回 boolean 值:false
对于 0
和 true
对于所有非零值。
如果你有一个 boolean 值 x
,你可以想到~x
作为~static_cast<int>(x)
和 x = ~x
作为x = ((~static_cast<int>(x)) != 0)
.
因此:
bool a = false;
bool b = ~a; // b = (~static_cast<int>(a) != 0)
// b = (~static_cast<int>(false) != 0)
// b = (~0 != 0)
// b = (0xffffffff != 0)
// b = true
bool c = ~b; // c = (~static_cast<int>(b) != 0)
// c = (~static_cast<int>(true) != 0)
// c = (~1 != 0)
// c = (0xfffffffe != 0)
// c = true
关于c++ - 按位不和逻辑不 : Why ~true == true and ~false == false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25211940/
我是一名优秀的程序员,十分优秀!