1

下面的Java代码的输出不被理解。 任何人都可以请告诉我它是如何工作的?Java Println如何工作评估特殊符号和算术运算?

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 
+0

它与'println()'无关。规则是Java的普通规则。 – EJP

+0

您可能希望选择一个答案并将其标记为解决方案(绿色复选标记)。 – user1803551

回答

1

char数据类型是+单个16-bit Unicode character.The值为43

所以,

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

Java定义type promotion rules适用于表达

首先,所有字节焦炭值提升到INT。那么如果其中一个操作数是,整个表达式被提升为

+1

不是* ASCII *,UTF-16。但是,是的。可以使用解释为什么'int + char'是'int'。 –

+0

这是否意味着当我们使用'+'运算符来添加/连接一个整数和一个char我们得到整数值?就像String和其他使用'+'运算符的数据类型变成String一样。 –

+0

'char'在表达式中被提升为它的'int'等价物,然后执行操作。 – thegauravmahawar

0

ASCII - Wikipedia

见上面的链接了解更多关于ASCII码。

表达

第(i + '+')

到它的对应的计算结果为第(i + 43)中,作为 '+' 被视为此处的字符被转换ASCII代码(这恰好是43)时加入到整数i,这是等于5

其余不用说,5 + 43 = 48。

这在java中被称为隐式投射。

请参阅widening primitive conversion

1

你最好的朋友是JLS:

15.18.2。加法运算符(+和 - ),用于数字类型当施加到两个操作数的数字类型的 ,产生操作数的总和

二进制+运算执行加法。

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

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

4.2。原始类型和值

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

整数类型是字节,短整型和长整型......和char,其值是16位无符号整数,代表UTF-16代码单元(§3.1)。

,并解释 “二元数值提升”:

5.6.2。二进制数值提升

当操作者施加的二进制数值提升到一对操作数,其中的每一个必须表示一个值,该值可以转换为一个数字类型,适用下列规则,为了:

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

  2. 加宽原语转换(§5.1.2)被施加到转换要么 或作为指定由以下规则两个操作数:

    如果操作数的类型是双,其他被转换为 两倍。

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

    否则,如果其中一个操作数的类型为long,则另一个操作数将被转换为长整型 。

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

(重点煤矿)

由于您的int和焦炭是他们进行二进制数字转换,这炭转换为使用UTF-16的int数字类型。