Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;与XOR值比较的奇怪行为_C++_C_File - Fatal编程技术网

C++ C++;与XOR值比较的奇怪行为

C++ C++;与XOR值比较的奇怪行为,c++,c,file,C++,C,File,让我们看下面的程序(名为charco.cpp,有意以/开头): // #包括 #包括 int main() { 文件*fp=fopen(“charco.cpp”,“rt”); char c=fgetc(fp); 如果(c=='/')) { 字符c2=fgetc(fp); 如果(c2==122^85)//***正常 { c2=fgetc(fp); 而(c2!=246^252)//****不正常 { c2=fgetc(fp); } } } } 在其当前版本中,它将永远在****NOT OK指示的行

让我们看下面的程序(名为
charco.cpp
,有意以
/
开头):

//
#包括
#包括
int main()
{
文件*fp=fopen(“charco.cpp”,“rt”);
char c=fgetc(fp);
如果(c=='/'))
{
字符c2=fgetc(fp);
如果(c2==122^85)//***正常
{
c2=fgetc(fp);
而(c2!=246^252)//****不正常
{
c2=fgetc(fp);
}
}
}
}
在其当前版本中,它将永远在
****NOT OK
指示的行中循环,因为它将无法匹配
/
后面的结束行字符,因此它将读取整个文件

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

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

你正在做:

while ((c2 != 246)^252) // Fail, bool^252
如果c2!=246,这将得到253(0^252)。否则将给出252

必须使用括号:-)

,按位运算符有一个奇怪的名称

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

while (c2 != (246^252))
事实上,我强烈建议在使用这些运算符时始终使用括号

这里有一个简单的例子来说明区别:

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

<代码>为什么这个C++问题被标记?@博格达:不是很好的C++,但是C++。你能把所有这些“把自我读入
文件
”的gubbins抽象出来,给我们看一些你认为错误的XOR运算符的输入和输出吗?注意,它返回一个
int
。另请注意,的mode
“rt”
参数是非标准的。我参考此页:当我对优先级有疑问时(或仅包括安全参数)。有关参考(参考OP),请参阅例如。我曾经做过一个C11优先表。是的。。。这也解释了为什么
(c2==122^85)
,尽管它给出了一个非常奇怪的值,但它被正确地执行了…@Lundin我将打印它并粘贴在墙上,作为这一天的提醒。。实际上,我已经看过运算符优先级表。。。只是没有发现问题:(@fritzone只有真正的C书呆子才知道语言中每个操作符的操作符优先级:)这就是为什么总是鼓励使用额外的括号作为良好的编程实践的原因。即使您知道某些特定运算符的运算符优先级,阅读代码的人也可能不知道。即使是C语言的创建者,运算符的优先级==也会引起麻烦。这是C的一种设计缺陷。我想看看这些历史原因:)我只是想找一篇好文章。。基本上,最初按位运算符用于逻辑运算符,实际的逻辑运算符后来添加到语言中,但到那时,他们不想固定优先级-太多代码依赖于优先级顺序。
while (c2 != (246^252)) // Correct, c2 != 10
while (c2 != (246^252))
cout << (1 == 1 ^ 2) << " " << (1 == (1 ^ 2)); 
// 3 0