为什么这个程序:
import java.io.*;
public class testpage
{
public static void main(String [] args)
{
pri();
}
public static int p2 (int x)
{
System.out.print("p");
return x * x + 1;
}
public static void pri ( )
{
int y = 3;
System.out.print( p2(y) + "-" + p2(y));
}
}
输出:
pp10-10
具体来说,当方法调用相同时,为什么-
两侧的输出会不同?
答案 0 :(得分:10)
Java将在执行操作之前评估二进制运算符(例如+
)的操作数。这意味着在连接发生之前将p2(y)
调用两次。 2方法在连接之前调用每个打印p
,然后System.out.print
打印10-10
。
JLS, Section 15.17.2,涵盖了这个:
Java编程语言保证在执行操作本身的任何部分之前,操作符的每个操作数(条件运算符&&,||和?:)除外似乎都要完全评估。
答案 1 :(得分:1)
其评估如下
p2(y) +"-" + p2(y)
首先调用 p2(y)
并打印p并返回10.
然后"-"
将被评估,但它将保持原样。
然后将再次评估第二个p2(y)
,它再次调用打印p并返回10的方法。
注意:在评估操作数时,返回值是否为打印位置。
评估操作数后
现在整个表达式从p2(y) +"-" + p2(y)
变为
p2(y) -> p
- -> do nothing as its not call to any method
p2(y) ->p
所以输出来了
p
第一次操作数评估,p
第二次操作数评估,然后是p2(y)
- >在cancatenating时替换的返回值。
所以输出为
pp10-10
其中打印pp
用于操作数评估,其余时间在cancatenation期间。
有什么疑问?