使用添加运算符理解 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 语句之间的区别
我试图了解编译器如何查看以下打印语句。这很简单但有点有趣。
这会打印附加值。足够有说服力。
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 语句之间的区别