这是什么=! 运营商?

我对这个代码感到惊讶:

if (a =! b) { // let it be on false ... } 

a从来没有被赋值。 这个操作员是关于什么的?

那是两个运算符, =! , 不是一个。 这可能是一种混乱的写作方式

 a = !b; if (a) { // whatever } 

a设置为b的逻辑逆,并testing结果是否为真(或者等同于b是否为假)。

或者它可能是a != b的迷雾。

很久以前,当恐龙在地球上漫游,C在PDP-11上的第五版UNIX上运行时, =! 是“不平等”的运营商。 这个用法在标准C的创build中被弃用了,所以现在它意味着“赋值逻辑反”,如a = !b 。 对于总是围绕二元运算符而言,这是一个很好的说法,只是为了让读者明白编译器在想什么。

我有点惊讶没有人提到这一点,但是,我可能是唯一一个曾经触摸过C编译器的用户。

a被赋予该行的b的布尔否定。 这只是一个错误的格式

 if( a = !b ) { 

…和一个条件内的邪恶隐藏的任务。

 a =! b 

只是一个有趣的方式

 a = !b 

即分配not ba

expression式的值是赋值之后的值。

用下面的代码可以看到,expression式a = !b!false (即true ),然后可以通过检查a的值来看到赋值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"); } 

结果:

 a is false! expression is true! a is true! 

C ++中的运算符

根据C / C ++运算符列表,没有运算符,如=! 。 但是,有一个运算符!=不等于比较运算符/关系运算符

有两种可能性。

  1. 可能是错字,因为我已经注意到了=! 运算符在if语句中,有人试图input!=而不是=! 因为!=是返回true或false的比较运算符。
  2. 可能,开发人员试图把b的布尔否定分配给a ,他/她犯了一个错字,忘了在等号后面放一个空格。 无论如何,这是编译器如何解释它。 根据c ++中的运算符优先级
    • 运算符逻辑非( ! )优先级3关联性从右到左
    • 运算符直接分配(=)优先级16关联性从右到左

它们是两个不同的运算符: = (赋值)运算符和! 运营商。 它可以基本上被转化为一个赋值为b的否定值。

 if (a = !b) 

但是,用户可能打算写的是!=运算符:

 if (a != b) 

这不是一个单一的操作符,但是,它是混淆代码的好方法。

如果它被写成a=!b ,那么空格可能不会导致你相信它是一个单一的操作符。

除非将整个语句包装在一组括号中,否则编译器会在条件expression式中给出警告,这是此警告何时有用的完美示例。

这两个语句在function上是完全相同的,但是一个会产生一个警告,另一个不会:

 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可能是作者的意图。

C ++没有=! 运算符,这意味着这是一个=运算符后面跟一个! 运营商。 所以,你只要在if条件中有a = !b

这是关于代码的清晰度:

应该写成: if (a = !b)

if (a = !b)与说a被分配给!b 。 所以在技术上有2个独立的操作符被使用, =这是一个赋值操作,而! 这是一个合乎逻辑的expression。

只要把=!之间的空格 它解决了这个困惑。

这可能有三个原因:

  1. 这可能是对!=运算符的迷惑,意思是不相等的。 例:

     if (a != b) { // a is not equal to b } 
  2. 这可能是a mistyping a == !b ,意思是a不等于b ,这通常与布尔值一起使用。 例:

     if (a == !b) { // The boolean a is equal to not b (a is not equal to b) } 
  3. 它可能试图分配a b的倒数。 例:

     bool a = !b; // Sets a to the opposite of b 

我认为这是写作或印刷错误之一。 因为如果我们不能编译这个代码,因为它存在编译时错误。 这里这里是if子句,返回types必须是boolean。 那么怎么可能。 答案只是一个错误,或者像迈克说混乱的写作方式

只有当variablesa和b都是布尔型的时候,才会被编译成a等于(not)b ie(a =!b)。

这可以视为a被分配给!b

我想回答你的问题,并且与迈克的答案一致 ,我只是加起来。

你也可以通过a=!!b来理解。
代码a=!b0返回给a并且a=!!b1返回给a

这个=! 不是一个单一的运营商,而是这两者的结合。 这些types的问题被要求误导学生检查他们的编码技能