我对这段代码感到惊讶:
if (a =! b) { // let it be on false
...
}
但a
永远不会被值分配。这个运营商是关于什么的?
答案 0 :(得分:391)
这是两个运营商,=
和!
,而非一个。这可能是一种混淆的写作方式
a = !b;
if (a) {
// whatever
}
将a
设置为b
的逻辑反转,并测试结果是否为真(或等效地,b
是否为假)。
或者它可能是a != b
的错误输入。
答案 1 :(得分:279)
很久以前,当恐龙在地球上漫游并且C在第二版UNIX上运行PDP-11时,=!
是'不等于'运算符。通过创建标准C 不推荐使用此用法,因此现在它意味着“分配逻辑逆”,如a = !b
中所示。这是一个很好的论据,总是围绕着带有空格的二元运算符,只是为了让人清楚地阅读代码编译器正在思考的代码。
我有点惊讶没有其他人提到这一点,但是我再次成为唯一一个曾经触及旧编译器的SO用户。
答案 2 :(得分:54)
a
在该行中被赋予b
的布尔否定。这只是一个错误的格式
if( a = !b ) {
......并且在一个条件中有一个邪恶的隐藏任务。
答案 3 :(得分:46)
a =! b
只是一种有趣的放置方式
a = !b
即。将not b
分配给a
。
分配后表达式的值为a
。
使用下面的代码,您可以看到表达式a = !b
的值为!false
(即true
),然后您可以通过检查值来查看分配a
的{{1}},也是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");
}
结果:
a is false!
expression is true!
a is true!
答案 4 :(得分:35)
根据C / C ++运算符列表,没有=!
之类的运算符。但是,有一个运算符!=
(不等于,比较运算符/关系运算符)
=!
运算符在if
语句中而有人试图键入!=
而不是{{} 1}}因为=!
是比较运算符,它返回 true或false 。!=
的布尔否定分配给b
并且他/她已经做错字错误并忘记在等号后放置一个空格。无论如何,这是编译器解释它的方式。
根据 Operator precedence in c++ :
a
)优先级 3 且关联性 从右向左强> 答案 5 :(得分:21)
它们是两个不同的运算符:=
(赋值)运算符和!
运算符。它基本上可以转换为a
赋值给b
的否定值。
if (a = !b)
但是,用户可能打算写的是!=
运算符:
if (a != b)
答案 6 :(得分:20)
这不是一个单一的运算符,但它是混淆代码的好方法。
如果改为编写a=!b
,则空格可能不会让您相信它是单个运算符。
编译器对条件表达式中的赋值有警告,除非您将整个语句包装在一组括号中,这是此警告何时有用的完美示例。
这两个陈述在功能上是相同的,但是一个产生警告而另一个没有:
if (a =! b) // Generates a warning with `-Wparentheses` (gcc)
if ((a =! b)) // No such warning
<强> -Wparentheses 强>
如果在某些上下文中省略了括号,则会发出警告,例如在上下文中有预期真值的赋值,或者操作符嵌套时,其优先级经常会让人感到困惑。
当然,这假设您是一名负责任的程序员,并且实际上阅读了编译器吐出的警告。
if (a = !b) // Assign A the value of (logical) NOT B and then test the truth
上面提到的编译器警告在编写此代码的人意外转置!
和=
时非常有用。但是,根据原始问题中隐含的内联评论,a = !b
可能是作者的意图。
答案 7 :(得分:18)
C ++没有=!
运算符,这意味着这是=
运算符,后跟!
运算符。因此,您只需在a = !b
条件中if
。
答案 8 :(得分:12)
这完全是关于代码的清晰度:
应写成:if (a = !b)
if (a = !b)
与a
分配给!b
的说法相同。因此,技术上使用了2个独立的运算符,=
是一个赋值操作,!
是一个逻辑表达式。
只需在=
和!
之间添加空格就可以解决这种混乱。
答案 9 :(得分:11)
这可能有三个原因:
这可能是!=
运算符的错误输入,意思是不等于。 示例:的
if (a != b) {
// a is not equal to b
}
这可能是一种错误的a == !b
,意思是a
等于b
,这最常用于布尔值。 示例:的
if (a == !b) {
// The boolean a is equal to not b (a is not equal to b)
}
可能会尝试将a
分配给b
的倒数。 示例:的
bool a = !b; // Sets a to the opposite of b
答案 10 :(得分:10)
我认为这是写作或打印错误之一。因为如果我们无法编译此代码,因为它存在编译时错误。这里面是 if 子句,返回类型必须是boolean。那怎么可能呢。答案只是一个错误或者迈克说模糊的写作方式。
只有当变量a和b都是布尔值时才有可能,它将被编译为 a等于(不是)b ,即(a =!b)。
答案 11 :(得分:6)
可以将此a
分配给!b
。
答案 12 :(得分:4)
我正在尝试回答您的问题,并且与迈克的answer达成一致,我只是加起来。
您也可以a=!!b
了解它
代码a=!b
将0
返回a
,a=!!b
将1
返回a
。
=!
不是单一的运营商,而是这两者的混合。
要求这些类型的问题误导学生检查他们的编码技能。