java - 不确定它如何使用“按值传递”参数传递得出值

标签 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 + " "); 
 {  
 {

期末考试类

答案的输出是: 每种参数传递模式的输出: 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 从哪里来

最佳答案

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

在 Java 中,只有按值调用,因此该 java 程序的输出将与标记为按值调用 (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 的类似程序会输出什么。

关于java - 不确定它如何使用“按值传递”参数传递得出值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4484559/

相关文章:

Java正则表达式最大长度与一个连字符

Java 小程序可排序列表

java - 将 Spring boot 容器连接到 Mongo 容器 : java.net.UnknownHostException : mongo: System error?

java - 为什么在 Java 锁实现中没有使用 synchronized 关键字?

java - 在 hibernate 中使用 jpa 时获取 hibernate.properties not found 和 java.lang.NoClassDefFoundError

java - java中如何调用带有Object参数而不是实际参数类型的方法?

java - 解析 TypeVariable

Java实现Iterable,对于每个和方法

java - JPanel SetPreferedSize 与实际大小不匹配

java - 为列表中的 JComboBox 创建对象