C++用于与XOR值进行比较的奇怪行为
C++ Strange behaviour for comparison with XOR value
让我们采用以下程序(称为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
由于历史原因,逐位运算符具有奇怪的运算符优先级。
你必须使用括号来强制执行正确的顺序:
while (c2 != (246^252))
事实上,我强烈建议在使用这些运算符时始终使用括号。
以下是一个显示差异的最小示例:
cout << (1 == 1 ^ 2) << " " << (1 == (1 ^ 2));
// 3 0
相关文章:
- C++模板函数,用于比较任何无符号整数和有符号整数
- 不正确的比较和交换计数器输出用于快速排序功能
- C++设置了一个用于排序的比较器和另一个用于唯一性的比较器
- 隐式转换为比较函数对象(函子)用于 std::sort 而不是 std::map?
- 用于基于成员字段或函数创建比较器的快捷方式
- 用于比较基元类型的std::可选的有趣程序集
- 如何实现通用比较?(用于数字和字符串)
- 内置用于比较两个(或多个)值的方式
- 我应该将 lambda 或函子用于比较函数吗?
- 更快的字符串比较排序,用于唯一()
- 奇怪的用户定义的比较结构错误,用于C++中的priority_queue
- 定制比较器,用于使用多种排序键来实现排序
- "Flattening" std::set<std::string> 用于存储和比较?
- 用于字符串比较的动态编程
- C++函数,用于比较不同排序算法的运行时
- 声明具有免费功能的Unordered_set,以用于用户定义的哈希和比较
- C 优化用于字符串比较和替换
- 如何将比较和交换用于任何共享数据结构的免等待互斥
- Visual Studio 2010 与 2012 编译时性能和稳定性比较,适用于C++用户
- C++用于与XOR值进行比较的奇怪行为