public class Test {
public static void main(String[] args) {
int number1 = 4;
int number2 = 5;
System.out.println( number1 + "Score:" + (number1 + number2) + number1 );
}
}
以上的输出是:
4Score: 94
这是为什么?如果那里没有“得分”,我理解它的结果,但我不知道为什么。 number1和Score:首先单独输出,那么为什么它会影响结果为94?
答案 0 :(得分:7)
你有:
public static void main(String[] args) {
int number1 = 4;
int number2 = 5;
System.out.println( number1 + "Score:" + (number1 + number2) + number1);
}
这正是输出你告诉它输出的内容,基本上是:
"4" + "Score:" + "9" + "4"
+
运算符与字符串一起使用时会将非String操作数转换为字符串并将字符串连接在一起。当+
与所有数字操作数一起使用时,它是一个算术+
,只是将这些值加在一起。
通过将(number1 + number2)
括在括号中,可以首先对其进行求值,并且因为两个操作数都是整数,所以它的行为是算术+
,它们将这两个数字相加(生成9)。然后将该结果转换为字符串并连接到其他所有内容。它本质上是一个捷径:
int number1 = 4;
int number2 = 5;
System.out.println( Integer.toString(number1) +
"Score:" +
Integer.toString(number1 + number2) +
Integer.toString(number1) );
如果你删除“得分:”,那么操作数的所有都是整数,因此所有+
运算符都是算术加法,它只是对所有数字求和 - 即:
System.out.println( Integer.toString(number1 + (number1 + number2) + number1) );
如果您希望+
运算符的更多技术细节与字符串与数字相关,请参阅Section 15.18 of the JLS(15.18.1描述了字符串的行为,15.18.2描述了数字类型的行为)。
顺便说一下,+
运算符总是左关联的,无论操作数是什么类型(在15.18.1中描述)。因此,以下结果可能会让您感到惊讶:
System.out.println(1 + 2 + "string" + 1 + 2);
剧透(鼠标悬停):
3string12
有关更多有用的示例,请参阅http://ideone.com/P11aMI。
答案 1 :(得分:5)
这与运算符优先级和+
运算符的重载有关。如果两个边都是数字,则+
运算符执行加法:
number1 + number2
结果为9,首先进行评估(因为它在括号中)。
然后,由于其余部分具有相同的优先级,因此按从左到右的顺序重载到字符串连接。如果运算符的一个或所有参数不是数字,则它们都将被隐式转换为字符串。我们从:
开始4 + "Score:" + (4 + 5) + 4
首先评估括号,然后我们得到:
4 + "Score:" + 9 + 4
哪个成为
"4Score:" + 9 + 4
然后
"4Score:9" + 4
你的最终结果将是
"4Score:94"
就像你得到的一样。
答案 2 :(得分:1)
子项number1 + number2被视为整数。因此可以计算总和:9。将其用作字符串参数会导致自动转换为字符串,因此使用字符串的串联:number1 +“Score:”+“9”+ number1
答案 3 :(得分:0)
System.out.println( number1 + "Score:" + (number1 + number2) + number1))
这会打印出以下值(括号中的值会产生算术总和:
4 + "Score:" + (4+5) + 4
是
4Score:94
答案 4 :(得分:0)
System.out.println( number1 + "Score:" + (number1 + number2) + number1));
这将是一步一步的
1) System.out.println( 4 + "Score:" + 9 + 4));
2) System.out.println( "4Score:" + 9 + 4));
3) System.out.println( "4Score:9" + 4));
然后它将输出显示为
"4Score:94"