找不到与我的案例相关的答案,所以我将尝试解释我的情况:
我有以下代码:
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)
所以问题是:
- 为什么?为什么它的行为与我的预期完全相反?
由于运算符优先级if ((lexStatus & fInCommentBlock) != fInCommentBlock)
修复了问题
- 我正在接近正确的方式吗?
- 有没有更好的办法?
- 有没有办法确保每个标志都有不同的价值?
添加最后一个问题是因为出于某种原因lexStatus & fInCommentBlock
,即使我没有在代码中的任何位置设置它们,也设置了一些位......
在此先感谢您的帮助!