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

Fer*_*eak 2 c c++ file

让我们采取以下程序(调用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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在它的当前版本中它将永远循环在指示的行中**** NOT OK,因为它将无法匹配结束后的字符,//因此它读取整个文件...

但是,如果我246 ^ 252改为10,(char)(246 ^ 252)或者只是'\n'它不再循环,它会正确匹配,但会(char)246^252再次失败.

任何人都可以解释我为什么这种奇怪的行为?(编译器:g ++ 4.9.2)

amc*_*con 16

while (c2 != 246^252)
Run Code Online (Sandbox Code Playgroud)

你在做:

while ((c2 != 246)^252) // Fail, bool^252
Run Code Online (Sandbox Code Playgroud)

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

你必须使用括号:-)

while (c2 != (246^252)) // Correct, c2 != 10
Run Code Online (Sandbox Code Playgroud)


Kar*_*ath 5

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

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

while (c2 != (246^252))
Run Code Online (Sandbox Code Playgroud)

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

这是一个显示差异的最小例子:

cout << (1 == 1 ^ 2) << " " << (1 == (1 ^ 2)); 
// 3 0
Run Code Online (Sandbox Code Playgroud)