zoukankan      html  css  js  c++  java
  • 警惕char类型直接相加

    今天在写某个程序需要对两个数字字符串进行相加操作,比如字符串1是"12345",字符串2是"23456"。需要字符串1中的"1" 和字符串2中的"2"相加,就是两个字符相同位置的数进行相加;以此类推。

    这个一看很好完成,写一个for,然后取字符串中每个字符进行相加即可。

    比如如下代码:

    string a= "12345";
    string b= "23456";
    string sum = "";
    for (int i = 0; i < a.Length; i++)
    {
        sum += a[i] + b[i];
    }

    心想结果应该是:357911

    实际结果是:99101103105107

    初一看是不是有点奇怪,这个结果也不像是字符累加的结果,如字符1+字符2,如果是这样那结果应该也是:1223344556。

    难道数据类型问题?转换int再相加试试?

    如果下图结果还是一样

    其实编译器已经告诉你了这里的类型转换是多余的, 所以(int)颜色变暗了。

    当时想这是为什么?随即我把字符串 a和b都换成字符不再使用数字试试。

    如下图所示

    心想这下输出结果总应该是:abbccddeeffg

    实际结果:195197199201203205

    看到这个瞬间明白了,char实际存储可能本身就是一个数字,这个数字就是该字符对应的十进制ASCII码。

    然后我就找到ASCII码对应表,一看果然是这样

    我们回到前面的字符串12345相加的那个问题上,看看。实际上程序相加的是1对应的ASCII+2对应的ASCII,以此类推。

    1对应49,2对应50。49+50=99。所以最开始123456字符相加的的结果是99开头的。(99101103105107)

    我们看下1-9对应的ASCII

    所有char相加一定要单独转换成字符再进行处理。

     

    当我们第一眼感觉sum += a[i] + b[i]或者sum += (int)a[i] + (int)b[i],就能实现数字的相加,可能原因在于我们平时使字符串要取单个字符时比如a[i],他输出显示确实是1,而不是ASCII码对应的49。

    我们将代码改下对char字符不参与运算只输出,并看输出结果

    我们看结果是12345,直接按照字符输出了。并不是输出ASCII码,我想可能是编译器进行优化导致的,毕竟输出ASCII意义不大。

    针对这个问题我还尝试其他语言,Java也是一样的。但是JS不会,JS不会按照ASCII码进行相加。

    Java代码

    JS代码

    
    
    
  • 相关阅读:
    Zabbix客户端日志出现(Not all processes could be identified, 解决
    zabbix 本地编译安装
    redis 配置文件解释 以及集群部署
    Unix shell范例精解 课后题
    if __name__ == '__main__':用法
    爬取猫眼电影100榜单 代码
    CentOS编译安装软件过程中遇到zlib.h: No such file or directory
    Codeigniter添加Composer支持
    CodeIgniter composer.json安装第三类库操作
    使用composer命令加载vendor中的第三方类库 的方法
  • 原文地址:https://www.cnblogs.com/rui1236/p/13810399.html
Copyright © 2011-2022 走看看