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

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

今天没事在写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’,呵呵哒,奇迹出现了:
这里写图片描述
容易得到,这里用 && 连接是正确的,所以以后写代码的时候应该尽量避免连写的方式,而是专用 && 连接的方式,这样至少不容易发生此类错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值