【发布时间】:2015-02-24 14:39:10
【问题描述】:
让我们使用以下程序(称为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)
【问题讨论】:
-
为什么这个 C++ 问题被标记为c?
-
@Borgleader:If he's compiling it with a C++ compiler, it's C++。不是很好的 C++,但是 C++。
-
@fritzone:你到底想做什么?你能抽象出所有这些“将自己读入
FILE”的gubbins,然后向我们展示一些你认为错误的XOR 运算符的输入和输出吗? -
当我对优先级存有疑问时,我会参考此页面:en.cppreference.com/w/cpp/language/operator_precedence(或者只是为了安全起见包含括号。)