嵌套" System.out.print"产量

时间:2014-05-29 17:54:50

标签: java system.out

为什么这个程序:

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

具体来说,当方法调用相同时,为什么-两侧的输出会不同?

2 个答案:

答案 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期间。

有什么疑问?