这是什么=!运营商?

时间:2014-01-09 19:18:00

标签: c++ c operators

我对这段代码感到惊讶:

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

a永远不会被值分配。这个运营商是关于什么的?

13 个答案:

答案 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)

Operators in C++

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

有两种可能性。

  1. 由于我注意到=!运算符在if语句中而有人试图键入!=而不是{{} 1}}因为=!是比较运算符,它返回 true或false
  2. 可能,开发人员试图将!=的布尔否定分配给b并且他/她已经做错字错误并忘记在等号后放置一个空格。无论如何,这是编译器解释它的方式。 根据 Operator precedence in c++
    • 运算符逻辑NOT(a)优先级 3 关联性 从右向左
    • 运营商直接分配(=)优先级 16 关联性 从右向左

答案 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)

这可能有三个原因:

  1. 这可能是!=运算符的错误输入,意思是不等于。 示例:

    if (a != b) {
        // a is not equal to b
    }
    
  2. 这可能是一种错误的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
    

答案 10 :(得分:10)

我认为这是写作或打印错误之一。因为如果我们无法编译此代码,因为它存在编译时错误。这里面是 if 子句,返回类型必须是boolean。那怎么可能呢。答案只是一个错误或者迈克说模糊的写作方式

只有当变量a和b都是布尔值时才有可能,它将被编译为 a等于(不是)b ,即(a =!b)。

答案 11 :(得分:6)

可以将此a分配给!b

答案 12 :(得分:4)

我正在尝试回答您的问题,并且与迈克的answer达成一致,我只是加起来。

您也可以a=!!b了解它 代码a=!b0返回aa=!!b1返回a

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