C++用于与XOR值进行比较的奇怪行为

C++ Strange behaviour for comparison with XOR value

本文关键字:比较 用于 XOR C++      更新时间:2023-10-16

让我们采用以下程序(称为charco.cpp,有意以//开头):

//
#include <iostream>
#include <stdio.h>
int main()
{
    FILE* fp = fopen("charco.cpp", "rt");
    char c = fgetc(fp);
    if(c == '/')
    {
        char c2 = fgetc(fp);
        if(c2 == 122^85) // *** OK
        {
            c2 = fgetc(fp);
            while(c2 != 246^252)  // **** NOT OK
            {
                c2 = fgetc(fp);
            }
        }
    }
}

在它的当前化身中,它将永远在用**** NOT OK指示的行中循环,因为它将无法匹配//之后的换行符,所以它读取整个文件。。。

然而,如果我将246 ^ 252更改为10(char)(246 ^ 252)或只是简单地将'n',则它不再永远循环,它正确匹配,但(char)246^252再次失败。

有人能解释一下为什么会有这种奇怪的行为吗?(编译器:g++4.9.2)

while (c2 != 246^252)

你正在做:

while ((c2 != 246)^252) // Fail, bool^252

如果c2!=246,这将给出253(0^252)。否则将给出252。

你必须使用括号:-)

while (c2 != (246^252)) // Correct, c2 != 10

由于历史原因,逐位运算符具有奇怪的运算符优先级。

你必须使用括号来强制执行正确的顺序:

while (c2 != (246^252))

事实上,我强烈建议在使用这些运算符时始终使用括号。

以下是一个显示差异的最小示例:

cout << (1 == 1 ^ 2) << " " << (1 == (1 ^ 2)); 
// 3 0