让我们采用以下程序(称为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

关于c++ - C++奇怪的行为,用于与XOR值进行比较,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28698603/

10-11 04:37