让我们采取以下计划(称为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)
答案 0 :(得分:16)
while (c2 != 246^252)
你在做:
while ((c2 != 246)^252) // Fail, bool^252
如果c2!= 246,这将给出253(0 ^ 252)。否则会给252。
你必须使用括号: - )
while (c2 != (246^252)) // Correct, c2 != 10
答案 1 :(得分:5)
For historical reasons,按位运算符有一个奇怪的operator precedence。
您必须使用括号来强制执行正确的顺序:
while (c2 != (246^252))
事实上,我强烈建议您在使用这些运算符时始终使用括号。
这是显示差异的最小例子:
cout << (1 == 1 ^ 2) << " " << (1 == (1 ^ 2));
// 3 0