"&varname == varname"是什么意思?

hmm*_*mmm 7 c++

我在工作中继承了一个C++项目,它是一个最初为Windows XP编写的应用程序,它在心理实验中呈现视觉刺激.我无法弄清楚这一行检查控制文件中的语法错误:

else if((m_SectorSwitchData.SectorType &ET_TMS == ET_TMS) & (m_SectorSwitchData.SectorType | ET_TMS != ET_TMS))
Run Code Online (Sandbox Code Playgroud)

我找不到任何关于"&ET_TMS == ET_TMS"含义的文档,这是一个错字吗?关于C++运算符的维基百科页面没有提到它,Visual Studio也没有将它标记为错误.

Nat*_*ica 15

这是按位和操作.为了便于解析,您可以添加一个空格和一些括号,以便于阅读:

(m_SectorSwitchData.SectorType & ET_TMS) == ET_TMS
Run Code Online (Sandbox Code Playgroud)

请注意,此更改实际上会更改代码的行为. &优先级低于==

(m_SectorSwitchData.SectorType & ET_TMS == ET_TMS)
Run Code Online (Sandbox Code Playgroud)

实际上是

(m_SectorSwitchData.SectorType & (ET_TMS == ET_TMS))
Run Code Online (Sandbox Code Playgroud)

这主要是原作者的错误

((m_SectorSwitchData.SectorType & ET_TMS) == ET_TMS)
Run Code Online (Sandbox Code Playgroud)

很可能是他们打算拥有的.这也适用于if语句的第二部分.


Lig*_*ica 5

这里一个错字,但它不是用&.

打字错误a & b == c意味着a & (b == c),至少在我看来,这似乎是作者的意图(a & b) == c.

现在,不要被遗失的空间误导 - 这不是一个参考或一个操作地址或类似的东西; 它是一个按位AND,随后省略了传统的空格.在它之后的镜像条件中,您会看到类似的条件,除了按位OR和包含的空格.

只要可以明确地识别令牌,C++就不会真正关心空格,并且它可以根据有效位置明确地识别它们.

a &b
a & b
a& b
a&b
Run Code Online (Sandbox Code Playgroud)

鉴于a并且b已经知道是表达式,上述四行是等价的.

当然,如果a是一个typename,那么它们都会被称为引用的声明(或声明的一部分)b!

然而,有意义的人会像这样写出表达变体:

a & b
Run Code Online (Sandbox Code Playgroud)

......和这样的宣言品种:

a& b
Run Code Online (Sandbox Code Playgroud)

一些没有意义的人写下这样的声明变种:

a &b
Run Code Online (Sandbox Code Playgroud)

......但是我认识的任何人都不会像这样写出表达变体,因为你发现它很奇怪而且令人困惑.:)