首页 > 其他 > 详细

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

时间:2015-03-27 08:53:41      阅读:224      评论:0      收藏:0      [点我收藏+]

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

今天没事在写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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!