1

以下 Java 代码的输出无法理解。谁能告诉我它是如何工作的?

int i=5;
System.out.println(i+'+');// Output is 48
System.out.println(i+'-');// Output is 50
System.out.println(i+'*');// Output is 47
System.out.println(i+'%');// Output is 42
System.out.println(i+'/');// Output is 52
4

3 回答 3

1

你最好的朋友是 JLS:

15.18.2。数字类型的加法运算符(+ 和 -)

二进制 + 运算符在应用于两个数字类型的操作数时执行加法,产生操作数的和。

对操作数执行二进制数字提升(第 5.6.2 节)。

解释“数字类型的操作数”:

4.2. 原始类型和值

数值类型是整数类型和浮点类型。

整数类型是 byte、short、int 和 long,...和​​char,它们的值是 16 位无符号整数,表示 UTF-16 代码单元(第 3.1 节)。

并解释“二进制数字提升”:

5.6.2. 二进制数字提升

当运算符将二进制数值提升应用于一对操作数时,每个操作数都必须表示一个可转换为数值类型的值,以下规则按顺序适用:

  1. 如果任何操作数属于引用类型,则将对其进行拆箱转换(第 5.1.8 节)。

  2. 加宽原语转换(第 5.1.2 节)适用于转换以下规则指定的一个或两个操作数:

    如果任一操作数是 double 类型,则另一个操作数将转换为 double。

    否则,如果任一操作数的类型为浮点型,则另一个将转换为浮点型。

    否则,如果任一操作数是 long 类型,则另一个将转换为 long。

    否则,两个操作数都转换为 int 类型。

(强调我的)

由于您的 int 和 char 是数字类型,因此它们会进行二进制数字转换,即使用 UTF-16 将 char 转换为 int。

于 2015-10-18T14:55:55.280 回答
1

char数据类型为单个16-bit Unicode字符。的+值为43

所以,

System.out.println(i+'+'); //prints 48

Java定义type promotion rules适用于表达式

首先,所有byteshortchar值都被提升为int。然后,如果其中一个操作数是long,则整个表达式被提升为long

于 2015-10-18T14:31:49.053 回答
0

ASCII - 维基百科

请参阅上面的链接以了解有关 ASCII 代码的更多信息。

表达方式

(i+'+')

计算结果为 (i+43),因为 '+' 在这里被视为一个字符,当它添加到等于 5 的整数 i 时,它被转换为相应的 ASCII 码(恰好是 43)。

其余的不言而喻,5+43 = 48。

这在 java 中称为隐式转换。

请参阅扩大原始转换

于 2015-10-18T14:47:11.687 回答