接线员!产生意想不到的结果

时间:2019-09-18 08:43:51

标签: c++

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

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

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

2 个答案:

答案 0 :(得分:5)

!!x分组为!(!x)

!x如果x为非零,则为0;如果x为零,则为1。

对此应用!会反转结果。

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

答案 1 :(得分:0)

  

...!(-12)请解释这个表达式。

这是“逻辑非-12”。在C ++中,数字0在逻辑上为false,任何非零值在逻辑上为true。这样,C和C ++会在布尔上下文(例如if (expression) ...)中评估数值,即if (-12) exit(1);会退出您的应用程序,因为-12是“ true”。

当您将数值强制转换为bool类型,然后又返回到int时,真值将变为值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"

即二进制运算符是& | ~ ^(并且,或者不是xor),而它们的逻辑同胞是&& || !,表示“以及,或者不是”,逻辑“ xor”在C ++中没有运算符。