黑马程序员技术交流社区

标题: 一道小题,为什么必须得这样 [打印本页]

作者: 黑马-唐磊    时间: 2012-12-20 18:33
标题: 一道小题,为什么必须得这样
public class demo2 {
        public static void main(String[] args) {
                char[] num={'黑', '马', '程', '序', '员' };
                String s1="01234";
                String s2=num[s1.charAt(2)-'0']+"";//在这里为什么要减去0,如果不写-0为什么出现数组角标越界异常
                System.out.println(s2);
        }
}
作者: 王小聪    时间: 2012-12-20 18:41
你好,你现在的数组是字节。数组都是有下标的啊,而且也有长度。-‘0’就相当于长度-1了
作者: 王小聪    时间: 2012-12-20 18:42
你好,你现在的数组是字节。数组都是有下标的啊,而且也有长度。-‘0’就相当于长度-1了
作者: 高新杰    时间: 2012-12-20 19:00
java中字符相减会默认转化为整形,如a-2相当于97-2;如果不对s1.charAt(2)进行减‘0’运算得到的是字符2的asc的码值为50,num[50]数组越界;s1.charAt(2)-'0'相当于整形运算50-48=2,num[2]没有越界
作者: 蔡少凯    时间: 2012-12-20 19:39
charAt()方法返回的是指定索引出的char值 s1.charAt(2)得到的char值为字符'2' 如果不减去字符'0' 就相当于查找num[50] 所以角标越界 减去字符'0' 查找的就是mum[2] 得到'程'这个字符 和""相连接后类型提升 得到字符串"程"
作者: 焦健    时间: 2012-12-20 19:40
因为charAt方法返回指定索引处的 char 值,即字符型的数值,而角标需要的是int类型的值,所以会进行转换,把char类型的2,转为int类型的数据是其ASCII码值50,要想得到正确的角标,就要把char类型转换int类型时多出的数值减去,‘o'对应的是48,所以减去’o'。这是C语言里面经常用到的转换动作。
作者: 臧盼    时间: 2012-12-20 20:30
public class demo2 {
        public static void main(String[] args) {
                char[] num={'黑', '马', '程', '序', '员' };
                String s1="01234";
                String s2=num[s1.charAt(2)-'0']+"";//在这里为什么要减去0,如果不写-0为什么出现数组角标越界异常
                System.out.println(s2);
        }
}
s1.charAt(2);是取得s1中的'2'这个字符,而num数组长度为5,'2'转换成整形远远大于5,所以发生数组角标越界,而'2'-'0'=2,所以不会发生角标越界。
作者: 程宏志    时间: 2012-12-20 21:57
String s2=num[s1.charAt(2)-'0']+"";
这段代码不知你知道意思不?s1.charAt(2)的到的是'2',这是一个字符2,而不是一个数字,
之所以减‘0’,是因为在ACSII中字符0对应的是 48,也是就是说字符数字装换成对应的int数字,那么我们需要减
48,所以才会这样,其实楼主你将 ‘0’改成48,结果也是一样。
作者: filter    时间: 2012-12-21 09:49
public class demo2 {
        public static void main(String[] args) {
                char[] num={'黑', '马', '程', '序', '员' };
                String s1="01234";
                String s2=num[s1.charAt(2)-'0']+"";//在这里为什么要减去0,如果不写-0为什么出现数组角标越界异常
                System.out.println(s2);
        }
}
s1.charAt(2)这个是字符串s1的一个方法,返回的是索引2位置的字符,也就是字符'2'
num是个字符数组,num[]里面中括号里面只能是数字,而字符'2'是字符类型,他的ASC码值是50,但是num长度只有5,当然会报字符数组长度越界
字符'0'的ASC码值是48,用'2'-'0'得到整数2,就得到num索引2处的字符--'程',后面(+ '''')是让结果变成字符串,不然会和s2的类型不匹配




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