为什么我输出10 2030?我无法弄清楚为什么它不输出10 50?
public class Testing1 {
public static void main (String args[]){
int num1=10,num2=20,num3=30;
System.out.println(num1+" "+num2+num3);
}
}
答案 0 :(得分:7)
System.out.println(num1+" "+(num2+num3));
评估表达式,
优先级较高的Operators在优先级相对较低的运算符之前进行求值。同一行上的运算符具有相同的优先级。当相同优先级的运算符出现在同一表达式中时,规则必须控制首先计算的值。除赋值运算符之外的所有二元运算符都是从
**left to right**
计算的;赋值运算符从右到左进行求值。
System.out.println(num1+" "+num2+num3);
--------------------10-----------------num1
--------------------10 -----------------num1+" "
--------------------10 20-----------------num1+" "+num2
--------------------10 2030-----------------num1+" "+num2+num3
所以,现在你开始知道为什么你得到了这个输出。
让我们看看下面的语句如何为您提供所需的输出:
System.out.println(num1+" "+(num2+num3));
再次基于优先级,括号的优先级高于+
。所以
(num2+num3)
首先评估,其余的是相同的。
答案 1 :(得分:6)
这不起作用,因为表达式从左解释为正确,并考虑到operator precedence
走过去。
System.out.println(num1+" "+num2+num3);
首先你拿走num1
并在其上加一个空格,你现在有了“10
”。
其次,你将num2
连接到该字符串上,你有“10 20
”。
第三,你将num3
连接到那个,你有“10 2030
”。
事实上,你在做的是:
String s = num1 + " ";
s += num2;
s += num3;
答案 2 :(得分:1)
使用此:
System.out.println(num1 + " " +(num2 + num3));
如果您正在编写(num1 + " " + num2 + num3)
,Java将从num1
创建一个字符串,将字符串" "
添加到其中,将num2
生成的字符串添加到其中,然后添加从num3
到它的字符串。
加号优先被评估为字符串连接而不是数学+符号。
答案 3 :(得分:1)
因为优先顺序,即从左到右:
将评估 num1+" "
制作一个10
num2+num3
只会附加到该字符串,因为+
运算符介于其间
num1+" "
和num2+num3
形成10 2030
试试这种方式
System.out.println(num1+" "+(num2+num3));
有关优先级及其相关性的更多信息:http://www.cis.upenn.edu/~palsetia/java/precedenceTable.html
答案 4 :(得分:1)
制作System.out.println(num1+" "+ (num2+num3));
在执行操作时引入任何字符串时,会发生连接而不是实际操作。
所以,如果你做System.out.println(num1+num2+ " " +num3);
。您将获得输出30 30
这是因为您的操作是在引入字符串连接之前执行的。因此产生了操作结果。
请记住,在第一次连接发生后,所有操作数都将被视为字符串。
在连接之前,将评估所有操作。
答案 5 :(得分:1)
输出的原因是此上下文中的+
(先发生num1 + " "
)被视为连接运算符,其余的也被连接起来。其他答案建议使用括号来确保在字符串评估之前首先添加num2和num3。