黑马程序员技术交流社区

标题: 赋值运算符+=的另类使用 [打印本页]

作者: 高贵杰    时间: 2013-6-4 23:03
标题: 赋值运算符+=的另类使用
下面这段代码是我在一份练习资料中看到。主要讲的String类型是个常量的问题,但是我却从中感觉到赋值运算符+=的使用方法,很多变。代码是我写的练习,我不能全部解释出来,希望兄弟姐妹帮忙解释一下:

class StringDemo
{
        public static void main(String[] args)
        {
                String str = "hello",str1="hello",  str2="hello2",str3="hello3";
                char c='a',c1='a';

                str +="world";//两个字符串相连接
                c +='a';//两个字符相连接
                str2 +=c;//字符串与字符相连接
                c1 +=1.11;//字符串与数字相连接
                str3 += 4.22;//字符串与数字相连接
                str1 +='a';//字符串与具体字符相连接

                System.out.println("str +=world输出:"+str);
                System.out.println("c +=a 输出:"+c);
                System.out.println("str2 +=c输出:"+str2);
                System.out.println("c1 +=1.11输出:"+c1);
                System.out.println("str3 += 4.22输出:"+str3);
                System.out.println('a'+1);
                System.out.println("str1 +=a输出:"+str1);
        }
}
输出的结果是:

str +=world输出:helloworld
c +=a 输出:?
str2 +=c输出:hello2?
c1 +=1.11输出:b
str3 += 4.22输出:hello34.22
98
str1 +=a输出:helloa

我的问题是:在学习时,我们都将+=作为赋值运算符,主要用于将不同的数据类型值进行+=的运算使用。但是在第一条语句str +="world";的输出中,明显的将加好作为连接符使用,但是下面几条语句作为比较时,却发现字符与数字相连接,输出的是字符,可是在打印语句中直接相加,打印的确实数字。而且str2 +=c;与str1 +='a';同样都是字符串与字符相连接,却输出不同的结果。

请各位对java存在浓厚兴趣的同学一起思考一下,培养一下深入研究的兴趣,并且帮我解惑,谢谢!
作者: 神之梦    时间: 2013-6-4 23:37
本帖最后由 神之梦 于 2013-6-5 00:43 编辑

str2 +=c;与str1 +='a';输出的结果不同的的主要问题出在c+='a';这里,这样赋值之后就改变了c的值。这样赋值之后c对应的ASCII码值是194,
而根据测试得出,只能显示出ASCII码的数值范围在0~127对应的字符,超过这个范围系统就会问号?表示。。。
ASCII码表0~127对应的字符:




                                                              
如果:将char c='1';那么c+='A';
打印c输出的结果就为:r(因为'1'=49,'A'=65,相加就等于114='r')




作者: j816326    时间: 2013-6-4 23:51
如果+=左右两边的数据类型不同 ,可以看成左右两边有自动拆箱和自动装箱的动作。楼主能看明白吗。
作者: 郑锐    时间: 2013-6-4 23:54
‘a’+1的这个计算中,计算结果会被提升为int型,所以 'a'取的是它对应的数字编码97,打印结果是98.
你只要把结果强转一下就可以得到b了:char ch =(char)‘a’+1;你打印ch就可以看到答案是b了。

str2 +=c;与str1 +='a';同样都是字符串与字符相连接,却输出不同的结果。前面一个写错了,改成'c'结果就一样了。

作者: ccywhut    时间: 2013-6-5 00:35
       字符为一个字节,取值范围-128---127之间,+=是复合运算符,对类型没影响,也就是不会像+运算符那样会自动类型转换,要注意不能越界。
String str = "hello",str1="hello",  str2="hello2",str3="hello3";
        // char c='a',c1='a';
    改成 char c='A',c1='o';//2.2   把字符值改小点就可以了,'a'字符ACII码的值是97,'A'对应ACII码为65
    c +='a';//.你这是把两个'a'字符的ACII码的值相加,97+97的值会大于127,c越界了当然打出的是?

         c+='0';//   'A'对应ACII码为65,字符'0'对应48,相加为113,对应q  可以正常输出。
         str2 +=c;//




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2