使用添加运算符理解 java 字符串

understanding the java string with add operator

我试图了解编译器如何查看以下打印语句。这很简单但有点有趣。

这会打印附加值。足够有说服力。

System.out.println(1+2); //output: 3

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

System.out.println(1+2+"3");//output: 33

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

System.out.println("1"+2+3);//Should be 15 right? NO. It is 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 工作太多,但我发现了一些信息,通过玩它可能会有所帮助。

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

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

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

尽管如此,当您定义类型时,此结果确实会打印 15

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

那样的话,就可以完成拼接前的操作了。

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

编辑:您可以在 oracle 的网站上看到一些关于自动类型转换的信息 here

我猜 Java specification 解释得最好:

The + operator is syntactically left-associative, no matter whether it is determined by type analysis to represent string concatenation or numeric addition. In some cases care is required to get the desired result. For example, the expression:

a + b + c

is always regarded as meaning:

(a + b) + c

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

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

所有这些都会导致复合公式 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.The 其他变量也被转换为一个字符串,然后连接起来。但是,当两个整数用 + 符号运算时,+ 充当加法运算符而不是连接运算符。 如果 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 语句之间的区别