我刚刚为我的编程语言课程进行了测验,并遇到了这个问题:
假设按名称呼叫,以下代码的结果是什么:
public class MyClass {
static int i = 1;
static float f(int x, int i){
int s = 0;
for(i = 0; i <3; i++){
s = s + x;
}
return s;
}
static void g(){
int[] a= {10,30,50};
int[] b = {20,40,60};
System.out.println(f(i, i));
i = 1;
System.out.println(f(a[i],i));
i = 1;
System.out.println(f((a[i] *b[i]), i));
}
public static void main(String[]args){
g();
}
}
上面的代码与我的测验完全相同,但当时它在纸面上,所以我手动完成了计算并获得了结果3.0, 90.0, and 3600.0
。在我自己的计算机上运行代码后,结果与我计算的结果相同。
然而,问题是多项选择,最接近的选项是3.0, 90.0, and 4400.0
。这使我假设“按名称调用”一词改变了f
System.out.println(f((a[i] *b[i]), i));
的方式
有人可以解释一下如何在Java或C ++中使用4400.0吗?
答案 0 :(得分:3)
在call-by-name中,用作参数的表达式直接在被调用函数中替换。 在调用函数之前不会对它们进行求值,但会在函数中的参数出现处替换它们。
这意味着对f
的最后一次调用与此相同:
int s = 0;
for(i = 0; i <3; i++){
s = s + (a[i] * b[i]);
}
return s;
以上是对f
的最后一次调用中的完整步骤序列(我希望这很清楚):
s = 0
i = 0
s = s + (a[i] * b[i])
= 0 + (a[0] * b[0])
= 0 + (10 * 20)
= 200
i = 1
s = s + (a[i] * b[i])
= 200 + (a[1] * b[1])
= 200 + (30 * 40)
= 200 + 1200
= 1400
i = 2
s = s + (a[i] * b[i])
= 1400 + (a[2] * b[2])
= 1400 + (50 * 60)
= 1400 + 3000
= 4400
因此,当s
返回时,您可以看到4400
为f
。