ASCII和int值转换之间的混淆

时间:2016-01-22 19:24:05

标签: java

Java如何理解是否替换char或int?

String a="abc";
int b[]=new int[100];

System.out.println(a.charAt(0)); //prints 'a'
System.out.println(b[a.charAt(0)]); //accesses b[97] and does not give error for b['a']

6 个答案:

答案 0 :(得分:2)

使用扩展转换将char转换为int。这在Java语言规范的this section about unary numeric promotion中有所描述,具体来说是:

  

否则,如果操作数是编译时类型byteshortchar,则通过扩展原语将其提升为类型int的值转换(第5.1.2节)。

答案 1 :(得分:1)

当使用int时,

Java会自动将char强制转换为int

这是完全有效的Java代码:

public static void main(String[] args) {
    int field1 = 'a';
    System.out.println(field1);
}

答案 2 :(得分:0)

a.charAt(0)是一个字符,因此它知道在第一行打印a

在第二行中,索引始终是一个数字,因此Java会自动将char值转换为其数字对应值。

这不是一个真正安全的转换,因为a的具体数值可能因编码而异。

答案 3 :(得分:0)

有一个overload of println that specifically takes a char。这将分别处理char;如果没有此重载,int重载仍然存在,char将提升为intint重载将打印97,这是Unicode代码点(ASCII排列为英文字母,数字和常用标点符号)。

但是,在数组索引上下文中,它会按int提升为char

  

索引表达式经历一元数字提升(第5.6.1节)。提升类型必须为int,否则会发生编译时错误。

一元数字促销是将int提升为b[97]的内容,以便它访问char

通常最好避免将int隐式扩展为b[97],以避免出现意外情况,例如访问<param name="app.code">ks-with-rice-bundled-2.0.3-cm</param>

答案 4 :(得分:0)

这是由编译器推断的。可以使用char代替int。使用上下文确定使用哪一个 - 如果存在歧义,则优先使用给定类型。但是,如果只有其他类型在上下文中起作用(b['a']显然无效,那么它不适用于转换),则推断出此类型。

答案 5 :(得分:0)

对于以下内容:

System.out.println(a.charAt(0));

Java调用方法PrintStream.println(char x),因为您传递了一个字符。所以没问题。

但是对于以下内容:

System.out.println(b[a.charAt(0)]);

再次,a.charAt(0)返回字符&#39; a&#39;,但这一次,因为你试图获取数组的元素,它会将字符转换为int,因为你需要一个int来访问数组元素。