私のケースに関連する答えが見つからなかったので、私の状況を説明してみます:
私は次のコードを持っています:
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
コードのどこにも設定していなくても、一部のビットが設定されているため、最後の質問が追加されました...
よろしくお願いします!