无法找到与我的案件相关的答案,因此我将尝试解释我的情况:

我有以下代码:

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/

    10-11 19:58