【发布时间】:2010-03-02 08:43:17
【问题描述】:
System.out.println(1 + 2 + "3");
输出: 33
System.out.println("1" + 2 + 3);
输出: 123
【问题讨论】:
-
对于 .NET 开发人员的一些相关问题:stackoverflow.com/questions/517695
标签: java
System.out.println(1 + 2 + "3");
输出: 33
System.out.println("1" + 2 + 3);
输出: 123
【问题讨论】:
标签: java
嗯,这就是所谓的操作顺序。
1 + 2 计算为等于 3,然后将字符串“3”附加到它上面,将前 3 转换为字符串并打印“33”。
在您的第二个实例中,“1”已经是一个字符串,因此添加数字会将它们转换为要匹配的字符串,因此附加“2”,然后附加“3”并打印“123”。
附:字符串优先,因为它们比整数具有更高的转换优先级,因此它会将整数转换为字符串,但不会将字符串转换为整数,就像第二个示例一样。
【讨论】:
第一个语句将 1 和 2 相加(因为两者都是整数),然后将它们转换为字符串并附加字符串“3”。
第二条语句有一个字符串“1”,并将所有后续参数也转换为字符串。所以你得到 123。
【讨论】:
1 + 2 + "3"的情况
首先执行 1 和 2 的加法,然后将 3 连接到 3。
在"1" + 2 + 3
1 连接到 2,结果 ("12") 连接到 3
要记住的是:
如果 + 的任何一个操作数是字符串 + 充当连接,否则它充当加法。
【讨论】:
如果是 first ,它会执行 1+2 ,然后它会执行字符串连接操作,这样它就会给你 33。
在第二个语句的情况下,它对所有操作数进行字符串连接,因为第一个
操作数是字符串。所以它给你 123
【讨论】:
我不是 Java 专家,但我想这里的表达式是从左到右阅读的
在第一种情况下,它首先计算 1 + 3,得到 3 然后 3 + "3" 将前 3 转换为字符串并给出 "33"
在第二种情况下,它以 "1" + 2 开头,得到 "12" 然后是 "12" + 3 = "123"
这是使用运算符 + 连接 2 个字符串和另一个将 2 个数字相加的副作用。
【讨论】:
这是由Java Language Specification #15.18.1定义的
+ 运算符在语法上是左结合的,无论是通过类型分析确定是表示字符串连接还是数字加法。在某些情况下,需要小心才能获得所需的结果。例如,表达式:
a + b + c
始终被视为含义:(a + b) + c
然后对于每个子组(a+b)(我们称之为x)和(x + c):
如果只有一个操作数表达式是字符串类型,则对另一个操作数执行字符串转换(第 5.1.11 节)以在运行时生成字符串。
【讨论】:
每当另一个操作数出现时,编译器都会将一个操作数转换为它的等价字符串 + 是 String 的一个实例。
对于第二种情况: 运算符优先级导致“1”与等效于 2 的字符串的连接首先发生。然后将该结果与相当于 3 的字符串第二次连接。
要先完成整数加法,必须使用括号,像这样:
System.out.println("1" + (2 + 3));
对于第一种情况:运算符优先级将首先添加 1 和 2。现在,与此结果等效的字符串与“3”连接。
【讨论】:
system.out.println(-1>>>1);
对于第二种情况:运算符优先级导致“1”与等效于 2 的字符串的连接首先发生。然后将这个结果与相当于 3 的字符串第二次连接起来。
要先完成整数加法,必须使用括号,像这样:
【讨论】:
在第一种情况下,1 和 2 被视为整数,因此答案是 3,next + 将结果与字符串 3 连接起来。 在第二种情况下,“1”是一个字符串,sop 在出现字符串后将所有内容都视为字符串,即“2”和“3”也充当字符串,因此所有内容都连接起来以显示输出 123
【讨论】: