我在工作中继承了一个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语句的第二部分.
这里是一个错字,但它不是用&.
打字错误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)
......但是我认识的任何人都不会像这样写出表达变体,因为你发现它很奇怪而且令人困惑.:)
| 归档时间: |
|
| 查看次数: |
595 次 |
| 最近记录: |