随意写程序发现的一些细节问题一节思考
今天没事在写ACM上一些简单的题目时候,其中一个题目是将n进制转换为10进制,简单吧,但是我没想到的是,逻辑上没有问题的代码,计算出来的结果却是错的。输入:6A 15
贴上源码:
#include <iostream>
#include <cmath>
#include <string>
using namespace std;
//integer Hex conversion function declare(m Hex convert to Decimal)
long Hex(string num, int n);
int main()
{
string num;
int n;
cin >> num >> n;
cout << Hex(num, n);
return 0;
}
//function define and actualize
long Hex(string num, int n)
{
long result = 0;
for (int i = 0; i<num.size(); i++)
{
if (‘0‘ <= num[i] <= ‘9‘)
result += (num[i] - ‘0‘) * pow(n, (num.size() - i - 1));
else if (‘A‘ <= num[i] <= ‘Z‘)
result += (num[i] - ‘A‘ + 10) * pow(n, (num.size() - i - 1));
else if (‘a‘ <= num[i] <= ‘z‘)
result += (num[i] - ‘a‘ + 10) * pow(n, (num.size() - i - 1));
}
return result;
}
运行结果却是这样的:
6A为15进制,转换为10进制结果应该是100,这很明显计算错了,然后我又没有发现代码的逻辑错误,所以进行了调试,当我调试到这一步,十神奇的情况出现了:
注意看,num是一个string类型的字符串,num[i]的值是’A’,但是却 ‘0’<= num[i] <=’9’这个条件却成立了,不应该啊!!!开始我以为是编译器的问题,后面我将代码移植到gcc(codeblocks)上面去,发现结果还是这样的。
我仔细思考,会不会是这个条件的原因,我试着将‘0’<= num[i] <=’9’改作 ‘0’ <=num[i] && num[i] <=’9’,呵呵哒,奇迹出现了:
容易得到,这里用 && 连接是正确的,所以以后写代码的时候应该尽量避免连写的方式,而是专用 && 连接的方式,这样至少不容易发生此类错误。
原文:http://blog.csdn.net/fantasydreams/article/details/44657469