“&varname == varname”是什么意思?

时间:2018-11-09 16:51:42

标签: c++

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

else if((m_SectorSwitchData.SectorType &ET_TMS == ET_TMS) & (m_SectorSwitchData.SectorType | ET_TMS != ET_TMS))

我找不到有关“&ET_TMS == ET_TMS”含义的任何文档,这是拼写错误吗? The Wikipedia page on C++ operators doesn't mention it,Visual Studio不会将其标记为错误。

4 个答案:

答案 0 :(得分:15)

这是按位与运算。为了使解析更容易,您可以添加一个空格和一些括号以使其更易于阅读:

(m_SectorSwitchData.SectorType & ET_TMS) == ET_TMS

请注意,此更改实际上将更改代码的行为。 &的优先级比==低,因此

(m_SectorSwitchData.SectorType & ET_TMS == ET_TMS)

实际上是

(m_SectorSwitchData.SectorType & (ET_TMS == ET_TMS))

这主要是原始作者的错误,并且

((m_SectorSwitchData.SectorType & ET_TMS) == ET_TMS)

最有可能是他们想要的。这也适用于if语句的第二部分。

答案 1 :(得分:5)

是一个错字,但&却没有。

错别字是a & b == c的意思是a & (b == c),至少在我看来,作者似乎打算使用(a & b) == c

现在,不要被丢失的空间所迷惑-这不是引用或地址操作或类似的东西;这是按位的,并省略了随后的常规空白。在紧随其后的镜像状态中,您会看到类似的状态,除了按位OR和包含空格。

C ++并不真正关心空白,只要可以清楚地标识令牌,它就可以根据有效位置在哪里明确标识它们。

a &b
a & b
a& b
a&b

鉴于已知ab是表达式,以上四行是等效的。

当然,如果a是类型名,那么它们全都是名为b的引用的声明(或声明的一部分)!

有道理的人可以这样写各种表达形式:

a & b

…以及这样的声明品种:

a& b

一些毫无意义的人会这样写声明:

a &b

...但是我认识的人都不会这样写表达式,因为正如您所发现的那样,它很奇怪又令人困惑。 :)

答案 2 :(得分:2)

实际上,相等比较==的优先级高于逐位和&

a & b == ba & (b == b)相同,但与(a & b) == b不同。

答案 3 :(得分:0)

行表达式TreeSet可以用括号(m_SectorSwitchData.SectorType & ET_TMS == ET_TMS)括起来,并且按位应用于((m_SectorSwitchData.SectorType & ET_TMS) == ET_TMS)。结果将是一个数字,其中仅m_SectorSwitchData.SectorType的那些那些位在m_SectorSwitchData.SectorType常量中保持为1。检查是否等于ET_TMS等同于检查ET_TMS中是否也设置了ET_TMS中所有为1的位。 m_SectorSwitchData.SectorType的另一半相反。