我不小心输入了=!
而不是!=
,导致系统中的一个巨大错误暂时未被发现;我已修复它,但我很好奇=!
做了什么。
我有类似的东西
void foo(int param)
{
int a = 0;
...
if (a =! param)
{
// never got here even when `a` was not equal to `param`
}
...
}
有人可以解释上述if
语句正在评估的内容吗?
答案 0 :(得分:27)
这个表达式:
a =! param
将值!param
指定给a
。 !param
是在布尔上下文中计算的param的否定版本。
赋值运算符返回右侧的值,因此,如果if (a = !param)
为真,if
也会执行!param
正文。
答案 1 :(得分:9)
这不是一个=!
运营商。这是=
和!
,分配和否定。
相当于if (a = !param)
或
a = !param;
if (a) {
}
答案 2 :(得分:6)
=!
不是运营商。它是=
(赋值)运算符,!
(不是布尔值)运算符。
所以你有if (a = !param)
。赋值返回赋值的值,因此您基本上具有:
a = !param;
if (a) {
...
答案 3 :(得分:5)
如果您认为它可以是多个令牌,则效果应该很简单:
if (a = !param)
答案 4 :(得分:2)
重要提示:'=!' != '!='
:)
但是:'=!' == 'assignment of the negation of a value'
e.g。在伪:
bool a= true;
bool b=!a;
所以b是假的!
答案 5 :(得分:1)
=!不是运营商。你可以这样理解它。假设有一个语句a=!b
它是一个操作数b的赋值,但是在这里扭曲是在将b分配给a之前我们通过为操作数b添加前缀来反转b的状态!这基本上是逻辑非运算符。