我对此代码感到惊讶:
if (a =! b) { // let it be on false
...
}
Run Code Online (Sandbox Code Playgroud)
但是a永远不会被一个值赋值.这个运营商是关于什么的?
Mik*_*our 391
这是两个运营商,=而!不是一个.这可能是一种混淆的写作方式
a = !b;
if (a) {
// whatever
}
Run Code Online (Sandbox Code Playgroud)
设置a为逻辑反转b,并测试结果是否为真(或等效,是否b为假).
或者它可能是一种错误的a != b.
Wex*_*xor 279
很久以前,当恐龙在地球上漫游并且C在第二版UNIX上使用PDP-11时,=!是'不等于'的操作员.这种用法因标准C的创建而被弃用,所以现在它意味着"分配逻辑逆",如a = !b.这是始终围绕二元算空间,只是要清楚的一个很好的理由人类阅读的内容编译器是思想的代码.
我有点惊讶没有其他人提到这一点,但是我再次成为唯一一个曾经触及C编译器的SO用户.
Tim*_*mbo 54
a被赋予该行中的布尔否定b.这只是一个错误的格式
if( a = !b ) {
Run Code Online (Sandbox Code Playgroud)
......以及条件中的邪恶隐藏任务.
spl*_*lrs 46
a =! b
Run Code Online (Sandbox Code Playgroud)
只是一种有趣的推杆方式
a = !b
Run Code Online (Sandbox Code Playgroud)
即分配not b给a.
表达式的值a在赋值之后.
使用下面的代码,您可以看到表达式的值a = !b是!false(即true),然后您可以通过检查赋值来查看赋值a,这也是true.
#include <iostream>
int main()
{
bool a = false;
bool b = false;
if(a)
printf("a is true!\n");
else
printf("a is false!\n");
if(a = !b)
printf("expression is true!\n");
else
printf("expression is false!\n");
if(a)
printf("a is true!\n");
else
printf("a is false!\n");
}
Run Code Online (Sandbox Code Playgroud)
结果:
a is false!
expression is true!
a is true!
Run Code Online (Sandbox Code Playgroud)
Sim*_*mar 35
根据C/C++运营商列表,没有运营商如=!.但是,有一个运算符!=(不等于,比较运算符/关系运算符)
=!运算符处于if语句中并且有人试图键入!=而不是=!因为!=比较运算符返回true或false.b,a并且他/她已经做了错字错误并忘记在等号后放置一个空格.无论如何,这是编译器解释它的方式.根据c ++中的运算符优先级:
!)优先级为3,关联性为从右到左Sho*_*hoe 21
它们是两个不同的运算符:(=赋值)运算符和!运算符.它基本上可以转化a为对否定值的赋值b.
if (a = !b)
Run Code Online (Sandbox Code Playgroud)
但是,用户可能打算写的是!=运营商:
if (a != b)
Run Code Online (Sandbox Code Playgroud)
And*_*man 20
这不是一个单一的运算符,但它是混淆代码的好方法.
如果它是a=!b相反的,那么空格可能不会让你相信它是一个单一的操作符.
编译器在条件表达式中有赋值的警告,除非您将整个语句包装在一组括号中,这是此警告何时有用的完美示例.
这两个语句在功能上是相同的,但是一个生成警告而另一个不生成:
if (a =! b) // Generates a warning with `-Wparentheses` (gcc)
if ((a =! b)) // No such warning
Run Code Online (Sandbox Code Playgroud)
-Wparentheses
如果在某些上下文中省略括号,则会发出警告,例如在预期真值的上下文中存在赋值,或者当嵌套运算符时,优先级通常会让人感到困惑.
当然,这假设您是一个负责任的程序员并且实际上阅读了编译器吐出的警告.
if (a = !b) // Assign A the value of (logical) NOT B and then test the truth
Run Code Online (Sandbox Code Playgroud)
上面提到的编译器警告是在谁写了这个代码的人无意中调换的情况下,真正有用的!和=.但是,从您原始问题中的神秘内联评论来看,a = !b可能是作者的意图.
Rym*_*mes 12
这完全是关于代码的清晰度:
它应该写成: if (a = !b)
if (a = !b)与a分配给if 是一样的 !b.因此,技术上使用了两个独立的运算符,=这是一个赋值操作,!它是一个逻辑表达式.
只是在它之间放一个空格=,!它解决了这种混乱.
Joj*_*dmo 11
这可能有三个原因:
它可能是!=操作员的错误输入,意思是不等于.例:
if (a != b) {
// a is not equal to b
}
Run Code Online (Sandbox Code Playgroud)它可能是一种错误a == !b,意思a是等于b,这最常用于布尔.例:
if (a == !b) {
// The boolean a is equal to not b (a is not equal to b)
}
Run Code Online (Sandbox Code Playgroud)它可能试图分配a到反转b.例:
bool a = !b; // Sets a to the opposite of b
Run Code Online (Sandbox Code Playgroud)Ran*_*jit 10
我认为这是写作或印刷错误之一.因为如果我们无法编译此代码,因为它存在编译时错误.这里是if子句,返回类型必须是boolean.那怎么可能呢.答案只是一个错误,或者迈克说过混淆的写作方式.
并且只有当变量a和b都是布尔值时才可能被编译为a等于(不)b 即(a =!b).