无法找到与我的案件相关的答案,因此我将尝试解释我的情况:
我有以下代码:
enum Flags {
OnlySpaces = 1 << 0,
valComment = 1 << 1,
valCommentBlock = 1 << 2,
valLabelName = 1 << 3,
valVariableName = 1 << 4,
valFunctionName = 1 << 5,
invSyntax = 1 << 32,
fInVarLab = valLabelName|valVariableName,
fInIdentifier = valLabelName|valVariableName|valFunctionName,
fInCommentBlock = OnlySpaces|valCommentBlock,
initState = OnlySpaces|fInIdentifier|valComment,
};
int lexStatus = initState;
for (int i = 0; sc.More(); sc.Forward(), i++) {
if (sc.atLineStart) {
if (lexStatus & fInCommentBlock != fInCommentBlock) // Here is the problem
sc.SetState(DEFAULT);
lexStatus = initState;
}
... // More code
}
我的代码用于将文档词法化,并且仅当我不在注释栏中时,我才尝试执行操作。事实是,当我不在评论中时,以上陈述返回的正好相反...
下面的语句正确地完成了工作,但似乎违反直觉:
if (lexStatus & fInCommentBlock == fInCommentBlock)
所以问题是:
由于运算符(operator)优先
if ((lexStatus & fInCommentBlock) != fInCommentBlock)
解决了该问题添加最后一个问题是因为出于某些原因
lexStatus & fInCommentBlock
,因为即使我没有在代码中的任何位置设置某些位,也设置了一些位...在此先感谢您的帮助!
最佳答案
解决第一个问题:您的问题是运算符的优先级以及对按位运算符如何工作的理解。if (lexStatus & fInCommentBlock == fInCommentBlock)
这仅对您有效,因为==
的优先级高于&
,因此fInCommentBlock == fInCommentBlock
始终为true,因此与lexStatus & 1
相同,而与lexStatus & OnlySpaces
相同。当使用lexStatus == initState
时,这将是正确的,因为initState
包含标志OnlySpaces
。
您想将按位比较抽象为一个或两个辅助函数。
int LexStatus_Is(int flags) { return (lexStatus & flags) == flags; }
int LexStatus_IsNot(int flags) { return (lexStatus & flags) != flags; }
然后您可以编写:
if (LexStatus_IsNot(fInComment))
哪个会更直观。
关于c++ - 有没有一种直观的方式来检查标志和状态?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13204354/