Я просто прошел тест для своего класса языков программирования и наткнулся на этот вопрос:
Предполагая вызов по имени, каковы результаты следующего кода:
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));
Может кто-нибудь объяснить, как 4400.0 возможно в Java или C ++?
В вызове по имени выражения, используемые в качестве аргументов, подставляются непосредственно в вызываемую функцию. Они не оцениваются перед вызовом функции, но заменяются в каждом месте, где параметр встречается в функции.
Это означает, что последний звонок 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
возвращается.
Других решений пока нет …