7

我不小心打字=!而不是打字!=导致了系统中的一个巨大错误,该错误有一段时间未被检测到;从那以后我已经修复了它,但我很好奇它是做什么=!的。

我有这样的事情

void foo(int param)
{
    int a = 0;

    ... 

    if (a =! param)
    {
        // never got here even when `a` was not equal to `param`  
    }
    ...
}

有人可以解释上述if陈述的评价吗?

4

6 回答 6

29

这个表达式:

a =! param

将值分配!parama!param是在布尔上下文中求值的 param 的否定版本。

赋值运算符返回右侧的值,因此,如果为真,if (a = !param)也执行if主体。!param

于 2013-01-09T03:58:38.987 回答
12

它不是一个单一的=!运营商。它是=and !,赋值和否定。

它相当于if (a = !param), 或

a = !param;

if (a) {

}
于 2013-01-09T03:58:55.057 回答
7

=!不是运算符。它是=(赋值)运算符和!(布尔非)运算符。

所以你有if (a = !param). 赋值返回赋值的值,所以你基本上有:

a = !param;
if (a) {
   ...
于 2013-01-09T03:58:50.770 回答
5

如果您认为它可以是多个标记,则效果应该很简单:

if (a = !param)
于 2013-01-09T03:59:02.730 回答
2

重要: '=!' != '!=':)

但: '=!' == 'assignment of the negation of a value'

例如在伪:

bool a= true;
bool b=!a;

所以 b 是假的!

于 2014-01-12T16:54:12.250 回答
1

=!不是运算符。你可以这样理解。假设有一条语句a=!b,它是 a 中操作数 b 的赋值,但这里的扭曲是在将 b 分配给 a 之前,我们通过在操作数 b 前加上 ! 来反转 b 的状态 这基本上是逻辑非运算符。

于 2016-04-03T07:39:06.360 回答