Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否有一种直观的方式来检查标志和状态?_C++_Enums_Flags_Enum Flags_Bitflags - Fatal编程技术网

C++ 是否有一种直观的方式来检查标志和状态?

C++ 是否有一种直观的方式来检查标志和状态?,c++,enums,flags,enum-flags,bitflags,C++,Enums,Flags,Enum Flags,Bitflags,无法找到与我的案例相关的答案,因此我将尝试解释我的情况: 我有以下代码: enum Flags { OnlySpaces = 1 << 0, valComment = 1 << 1, valCommentBlock = 1 << 2, valLabelName = 1 << 3, valVariableName = 1 << 4, valFunctio

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

我有以下代码:

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
 }
我的代码用于对文档进行词法分析,仅当我不在注释块中时才尝试执行操作。问题是,当我不在评论中时,上面的语句返回的结果正好相反

以下陈述正确地完成了任务,但似乎有点违反直觉:

如果lexStatus&fInCommentBlock==fInCommentBlock

因此,问题是:

为什么?为什么它的表现与我的预期完全相反? 如果lexStatus和fInCommentBlock!=fInCommentBlock修复了这个问题

我走对了吗? 有更好的办法吗? 有没有办法确保每个标志都有一个不同的值? 添加最后一个问题是因为出于某种原因lexStatus&fInCommentBlock因为一些位被设置了,即使我没有在代码中的任何地方设置它们


提前感谢您的帮助

解决第一个问题:您的问题是运算符优先级和理解按位运算符的工作方式

如果lexStatus&fInCommentBlock==fInCommentBlock

这只适用于您,因为==的优先级高于&so fInCommentBlock==fInCommentBlock始终为true,因此与lexStatus&1相同,与lexStatus&OnlySpaces相同。当lexStatus==initState时,这将是真的,因为initState只包含标志空间

有更好的办法吗

您希望将逐位比较抽象为一个或两个辅助函数

int LexStatus_Is(int flags) { return (lexStatus & flags) == flags; }
int LexStatus_IsNot(int flags) { return (lexStatus & flags) != flags; }
然后你可以写:

如果LexStatus_未找到注释


这将更直观。

来回答您的第一个问题:您的问题是运算符优先级和理解按位运算符的工作方式

如果lexStatus&fInCommentBlock==fInCommentBlock

这只适用于您,因为==的优先级高于&so fInCommentBlock==fInCommentBlock始终为true,因此与lexStatus&1相同,与lexStatus&OnlySpaces相同。当lexStatus==initState时,这将是真的,因为initState只包含标志空间

有更好的办法吗

您希望将逐位比较抽象为一个或两个辅助函数

int LexStatus_Is(int flags) { return (lexStatus & flags) == flags; }
int LexStatus_IsNot(int flags) { return (lexStatus & flags) != flags; }
然后你可以写:

如果LexStatus_未找到注释


哪个更直观。

如果lexStatus和fInCommentBlock?总是返回true,有什么不对LexStatus=10,fInCommentBlock=118,LexStatus&fInCommentBlock=2fInCommentBlock==fInCommentBlock也总是会返回true,对吗?我不确定这是原因,但是:运算符优先级?是lexStatus&fInCommentBlock!=fInCommentBlock与lexStatus和fInCommentBlock一样!=fInCommentBlock?这确实让它按预期工作。。。我没有注意到它会影响它。其他两个问题仍然存在,但如果lexStatus和fInCommentBlock总是返回true,那又有什么问题呢LexStatus=10,fInCommentBlock=118,LexStatus&fInCommentBlock=2fInCommentBlock==fInCommentBlock也总是会返回true,对吗?我不确定这是原因,但是:运算符优先级?是lexStatus&fInCommentBlock!=fInCommentBlock与lexStatus和fInCommentBlock一样!=fInCommentBlock?这确实让它按预期工作。。。我没有注意到它会影响它。但另外两个问题仍然存在