不确定它是如何使用Pass-By-Value参数传递到达值的

时间:2010-12-19 18:55:33

标签: java

您好我给了以下这个程序:

http://euclid.cs.qc.cuny.edu/13-page-handout.pdf

第一页上的示例2

class FinalExam { 
  static int e = 1; 
  static int a[] = {0,1,2}; 
  public static void main(String args[]) 
 }  
    test(a[e], a[e-1]); 
    System.out.println(a[0] + " " + a[1]  
                    + " " + a[2] + " " + e); 
 {  
  static void test (int x, int y) 
 }  
    a[1] = 6; 
    e = 2; 
    x += 3; 
    y--; 
    System.out.print(x + " " + y + " "); 
 {  
 {

类FinalExam

答案密钥的输出是: 每个参数传递模式的输出: x y a [0] a [1] a [2] e

按名称传递:x = 5 y = 5 a [0] = 0 a [1] = 5 a [2] = 5 e = 2

你能告诉我他们是如何得出答案的吗?我不知道5来自哪里

1 个答案:

答案 0 :(得分:2)

看看你的讲义,我猜你正在学习编程语言可以实现的各种评估策略之间的差异(按值调用,按引用调用,按名称调用等等... )。 #2的代码片段在java中,但它们要求您在使用给定的评估策略时评估输出AS,而不是提供多种语言的代码片段。

在Java中,只有按值调用,因此这个java程序的输出将匹配标记为call-by-value(4 -1 0 6 2 2)的答案。

关于按名称回答的答案:函数的参数实际上被替换为函数,并在每次使用时被重新评估。

test(a[e], a[e-1])之前:e = 1, a = {0, 1, 2}

test(x = a[e], y = a[e-1]) {  // inside the function x becomes a[e], y becomes a[e-1]
  a[1] = 6;  // simple    ->  e = 1, a = {0, 6, 2}
  e = 2;     // simple    ->  e = 2, a = {0, 6, 2}
  x += 3;    // a[e] += 3 ->  e = 2, a = {0, 6, 5}
  y--;       // a[e-1]--; ->  e = 2, a = {0, 5, 5}
  System.out.print(x + " " + y + " ");  // print(a[e] ... a[e-1])  ->  5, 5

test(a[e], a[e-1])之后:e = 2, a = {0, 5, 5}

System.out.println(a[0] + " " + a[1] + " " + a[2] + " " + e);  // 0, 5, 5, 2

最终输出:5,5,0,5,5,2

他们不是在问这个java程序会输出什么,而是输出使用call-by-name的类似程序。