我在工作中继承了一个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不会将其标记为错误。
答案 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
鉴于已知a
和b
是表达式,以上四行是等效的。
当然,如果a
是类型名,那么它们全都是名为b
的引用的声明(或声明的一部分)!
有道理的人可以这样写各种表达形式:
a & b
…以及这样的声明品种:
a& b
一些毫无意义的人会这样写声明:
a &b
...但是我认识的人都不会这样写表达式,因为正如您所发现的那样,它很奇怪又令人困惑。 :)
答案 2 :(得分:2)
实际上,相等比较==
的优先级高于逐位和&
。
a & b == b
与a & (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
的另一半相反。