随意写程序发现的一些细节问题一节思考

随意写程序发现的一些细节问题一节思考

今天没事在写ACM上一些简单的题目时候,其中一个题目是将n进制转换为10进制,简单吧,但是我没想到的是,逻辑上没有问题的代码,计算出来的结果却是错的。输入:6A 15 贴上源码:

;//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 actualizelong 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’,呵呵哒,奇迹出现了:

容易得到,这里用 && 连接是正确的,所以以后写代码的时候应该尽量避免连写的方式,而是专用 && 连接的方式,这样至少不容易发生此类错误。

生命不是一场赛跑,而是一次旅行。比赛在乎终点,而旅行在乎沿途风景。

随意写程序发现的一些细节问题一节思考

相关文章:

你感兴趣的文章:

标签云: