繁体   English   中英

为什么整数与数字串联会产生字符串?

[英]Why does an Integer concatenated with a number result in a string?

我正在进行AP Comp Sci练习测试,发现以下问题:

什么是输出:

System.out.println("1" + new Integer(2) + 3);

答案是

123,

我很困惑,因为new Integer(2)没有被转换为字符串,因此如果两个部分都是整数,为什么java编译器认为new Integer(2) + 3语句是字符串连接?

加法是左联的。 a + b + c ==(a + b)+ c

答案是否与操作顺序一样简单,这意味着语句从左到右进行评估,以便可以读取。 System.out.println(“1”+ new Integer(2).toString()+ 3.toString());

首先,正如家伙所指出的那样,加法是左联想的。

其次,“1”+ 2的重载分辨率由左操作数控制,左操作数是一个字符串。 这迫使连接,结果是“12”。

现在,“12”+ 3经历完全相同的重载分辨率,你得到“123”。

最初的问题是:

System.out.println("1" + new Integer(2) + 3);

为什么这会给我们“123”; 我认为提问者的意思不是6或“15”?

让我们简化一下,将新的Integer位移到它的等价位:

System.out.println("1" + 2 + 3);

Java语言规范12给出了答案(4.2.2):

字符串连接运算符+(第15.18.1节),当给定一个字符串操作数和一个整数操作数时,它会将整数操作数转换为字符串(字节,小数,整数或长操作数的十进制形式,或者char操作数的字符),然后生成一个新创建的String,它是两个字符串的串联。 https://docs.oracle.com/javase/specs/

15.18.1部分更加清晰:

加法运算符具有相同的优先级,并且在语法上是左关联的(它们从左到右分组)。 如果+运算符的任一操作数的类型是String,则操作是字符串连接。 https://docs.oracle.com/javase/specs/

因此,由于在两种情况下都使用了运算符+,所以它从左到右进行评估,无论是连接还是加法,如15.18.1所述和其他答复者所述。 第一个操作数“1”是一个字符串,第二个操作数是一个整数2,所以根据上面的规则,整数2被转换为字符串“2”,而加号被解释为连接,给我们一个字符串“12”。 然后它有一个字符串“12”和一个整数3,所以根据上面的规则转换整数3,+再次被解释为连接,我们得到一个字符串“123”。

如果他们把括号放在2 + 3附近:

System.out.println("1" + (2 + 3));

显然,这会强制首先评估2 + 3。 它们都是整数,所以你得到一个整数5.然后我们将得到“1”+ 5,这是一个字符串加一个整数,所以整数转换为字符串“5”并且它们被连接起来,产生“15” 。

如果他们改变了这样的顺序:

System.out.println(2 + 3 + "1");

然后,首先按照从左到右的规则完成2 + 3,并且由于它们都是整数,+意味着加法,这将产生整数5.然后我们将有运算符整数5和一个字符串“1”。 根据上述规则,整数5被转换为字符串5,+被解释为连接,我们得到一个字符串“51”。

所有这一切归结为操作顺序,所有这些操作都是二进制的(一次只取两个),当使用加号时,如果一个操作数是一个字符串,另一个操作数改为一个字符串,如果它不是一个,加号被解释为连接,结果是一个字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM