用add运算符理解java字符串

我试图了解编译器如何查看以下print语句。 这很简单但有点吸引人。

这将打印添加的值。 足够令人信服。

的System.out.println(1 + 2); //输出:3

以下输出看起来也很有说服力:

System.out.println(1 + 2 +“3”); //输出:33

我的问题(基于上述行为)就在这里。

System.out.println(“1”+ 2 + 3); //应该是15对吗? 没有。 这是123。

我尝试了其他一些类似的陈述。 我能够看到两个明确的行为。

  • 如果整数位于前面而没有引号,则会添加它们,并且后续整数仅作为后缀添加到前面添加的值中。

  • 如果语句以字符串开头,则在引号下,则所有其他后续元素将作为后缀附加。

这是java api文档中的某个地方吗? 或者只是非常明显的字符串或添加操作员行为,我没有看到。 任何您宝贵的见解将不胜感激。

这是代码片段:

public static void main(String[] args) { System.out.println(1+2); System.out.println(1+2+"3"); System.out.println("1"+2+3); System.out.println("1"+2+"3"); System.out.println("1"+2); } // The Console output: // 3 // 33 // 123 // 123 // 12 

我想Java规范最好地解释了它:

无论是否通过类型分析确定表示字符串连接或数字加法,+运算符在语法上都是左关联的。 在某些情况下,需要注意获得所需的结果。 例如,表达式:

a + b + c

总是被视为含义:

(a + b) + c

因此,如果a是一个String ,那么它与b连接。 结果将是String类型,因此它继续与c连接。

我也发现这很有趣。 我最近在java中没有做太多工作,但我发现了一些可能通过玩它可能有用的信息。

我认为这与java所做的自动类型转换有关。

的System.out.println( “1” + 2 + 3);

如你所说打印123。 由于“1”被转换为字符串,因此Java假定第一个是字符串,后面的字符串将是用于连接的字符串,除非另有说明

虽然,在定义类型时,此结果会打印15

System.out.println(“1”+(int)(2 + 3));

在这种情况下,它可以在连接之前完成操作。

所以我认为java假设第一个是String,其余的将是字符串并连接它们。

编辑:你可以在这里看到oracle网站上有关自动类型转换的一些信息

+运算符在编译器中重载。 如果两个操作数都是数字,则+是加法。 如果其中一个或两个操作数都是String,则+是字符串连接。 (如果一个操作数是String而另一个是数字,则该数字将转换为String)。 最后, +从左到右绑定。

所有这一切导致复合公式a + b + c + ...从左到右添加,直到它到达第一个字符串操作数,此时它切换到公式的其余部分的字符串连接。 所以…

 "1" + 2 + 3 + 4 = 1234 /* cat cat cat */ 1 + "2" + 3 + 4 = 1234 /* cat cat cat */ 1 + 2 + "3" + 4 = 334 /* add cat cat */ 1 + 2 + 3 + "4" = 64 /* add add cat */ 

这是字符串的有趣部分。 将String添加到任何其他数据类型时,结果值是String。另一个变量也会转换为String,然后连接。 但是,当使用+符号操作两个整数时,+充当加法运算符而不是连接运算符。 如果println()或print()方法中的表达式包含括号,则首先计算括号内的值。 请考虑以下示例:

  int a = 5; int b = 6; System.out.println(a + b); // Output will be: 11 System.out.println("5" + "6"); // Output will be: 56 System.out.println("" + a + b); // Output will be: 56 System.out.println(5 + 6 + a + " " + b + a); // Output will be: 16 65 System.out.println("Result: " + a + b); // Output will be: 56 System.out.println("Result: " + (a + b)); // Output will be: 11 

您可以看到最后两个sysout语句之间的区别