操作员!! 产生意外的结果

Operator !! producing unexpected result

本文关键字:结果 意外 操作员      更新时间:2023-10-16

我有一个关于!!运算符的一些C++代码的问题。它给了我一个意想不到的结果,我不明白为什么:

int x=-12; 
x=!!x; 
print("value=",x);

其输出为1。但我不知道怎么做。谁能解释这个模棱两可的结果?

!!x被分组为!(!x)

如果x不为零,则!x为 0,如果x为零,则为 1。

对此应用!会逆转结果。

因此,!!x可以被视为一种将x设置为1(如果不为零(并保持为0的方法。换句话说,x = !!xx = x ? 1 : 0相同。

... !(-12(请解释一下这个表达方式。

这是"逻辑不是-12"。C++数值0以逻辑方式false,任何非零值以逻辑方式true。这就是 C 和 C++ 在布尔上下文中计算数值的方式,如if (expression) ...,即if (-12) exit(1);将退出您的应用程序,因为-12是"true"。

当您将数值类型转换为bool然后返回int时,true 将变为值1,但大多数情况下您可以避免这些转换并直接使用数值计算的中间结果,其中任何非零值都是"true"。

所以"不真实"是价值false,即!(-12) == false.和!false == true.并且您将逻辑值"true"转换回int,这将使x == 1.

!!(numeric_value)在C++(在 C 中也是(中是惯用的方式,可以将任何数值"规范化"为精确的 0 或 1(您可能会在许多应用程序的源代码中遇到它(。

"逻辑"区别很重要,因为C++也有二元运算符,其中计算是按单个位计算的,而不是整个值。在"二进制"方式中,"!"运算符同级是~。与你的类似的例子,使用位补码运算符x=~~x;将导致原始值-12,因为每个位x都会被翻转两次,以与开始时相同的值结束。因此,~~x在常规源代码中不会遇到,因为它基本上是"无操作"(与!!相反,只有当原始值已经是 0 或 1 时才是"无操作"(。

此外,这有时是学习该语言的人的错误来源,因为他们忘记了区别并写了类似的东西

if (4 & 2) { /* this is "and" so it should be true??? */ }
// it will be false, because in binary way 4&2 == 0
if (4 && 2) { /* this is logical "and" and will be "true" */ }
// because 4 is non-zero, 2 is non-zero, and "true and true" is "true"

即二元运算符是& | ~ ^的(和,或,不是,异或(,它们的逻辑兄弟姐妹&& || !为"和,或,不是",逻辑"异或"在C++中没有运算符。