这是什么=!运营商?

m0n*_*awk 175 c c++ operators

我对此代码感到惊讶:

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.

  • 通过编写自己的运算符来编写混淆代码的人可以` - >`地狱.等等,nooooooooooo! (182认同)
  • 我想知道这是否是某人试图键入的错字!=特别是因为它在if语句中 (42认同)
  • 可悲的是,有人可能会认为这是"他们的风格". (35认同)
  • @Jonathan Hobbs:["mistyping"](http://codegolf.stackexchange.com/a/16718/8793) (9认同)
  • @Cyber​​几乎肯定不是一个错误的错误,因为它后面的评论给出了一个模糊的逻辑意义,因为它实际上做了什么.如果没有代码,我将无法解释该评论,但它似乎肯定是一致的. (3认同)
  • 对于主要的混淆点,如果=运算符被覆盖以返回除LHS以外的东西,那么你可以获得一些真正的乐趣. (2认同)

Wex*_*xor 279

很久以前,当恐龙在地球上漫游并且C在第二版UNIX上使用PDP-11时,=!是'不等于'的操作员.这种用法因标准C的创建而被弃用,所以现在它意味着"分配逻辑逆",如a = !b.这是始终围绕二元算空间,只是要清楚的一个很好的理由人类阅读的内容编译器是思想的代码.

我有点惊讶没有其他人提到这一点,但是我再次成为唯一一个曾经触及C编译器的SO用户.

  • **+ 1**:我在第二次看到`//`单行注释时排除了任何古老的语法.这段代码***有***是C++或一些较新版本的C,因为它没有`/*...*/`注释.尽管如此,还是有点琐事. (67认同)
  • 那么,恐龙和我们想象的一样酷吗? (24认同)
  • 在Gondolin强大的国王沦陷之前的大约时代,古代抄写员也会颠倒赋值算子的顺序,写出"a = + b"来表示我们现在呈现为"a + = b"的东西.当空白无关紧要但命令确实如此时,有代表性的运算符有一种讨厌的方式与专题数据混合:考虑`a = - b`,`a = -b`,vs`a - = b`.在这里,老龙是龙,但没有像以前那样伟大,因为Eärendil杀死了黑色的Ancalagon并在他的堕落之下打破了Thangoradrim.当我们认为邪恶永远被征服时,我就在那里,但它从最黑暗的代码中回来,再次给我们带来麻烦. (16认同)
  • 这实际上是"这个运营商关于什么的唯一好答案".所有其他人似乎都试图忽略运营商的存在. (7认同)
  • s/dinosaurs/[compusaurs](http://alumnus.caltech.edu/~lschmidt/compusaurus.html):) (6认同)

Tim*_*mbo 54

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

if( a = !b ) {
Run Code Online (Sandbox Code Playgroud)

......以及条件中的邪恶隐藏任务.

  • 条件内的赋值不是邪恶的......虽然在这种情况下使用空格是令人困惑的. (4认同)
  • 条件中的任务确实是邪恶的.当你编写代码以产生可以用最少的努力阅读和理解的东西时,这很重要.可读性是可维护性的重要组成部分.所以,如果你正在写一个条件 - 让它看起来像一个条件.如果你正在做作业 - 让它看起来像作业.永远不要试图将一个伪装成另一个,或将其埋在另一个之内. (3认同)

spl*_*lrs 46

a =! b 
Run Code Online (Sandbox Code Playgroud)

只是一种有趣的推杆方式

a = !b
Run Code Online (Sandbox Code Playgroud)

即分配not ba.

表达式的值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)

  • 如果通过"一种有趣的方式",你的意思是邪恶和混乱,当然:) (19认同)
  • 这正是我的意思! (5认同)

Sim*_*mar 35

C++中的运算符

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

有两种可能性.

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

  • 感谢运营商优先级的链接,这一点非常重要. (2认同)

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


AnT*_*AnT 18

C++没有=!运算符,这意味着这是一个=运算符后面跟一个!运算符.所以,你只是a = !b处于这种if状态.


Rym*_*mes 12

这完全是关于代码的清晰度:

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

if (a = !b)a分配给if 是一样的 !b.因此,技术上使用了两个独立的运算符,=这是一个赋值操作,!它是一个逻辑表达式.

只是在它之间放一个空格=,!它解决了这种混乱.


Joj*_*dmo 11

这可能有三个原因:

  1. 它可能是!=操作员的错误输入,意思是不等于.例:

    if (a != b) {
        // a is not equal to b
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 它可能是一种错误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)
  3. 它可能试图分配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).


Nit*_*sra 6

这可以按照a指定的方式进行!b.