Каков результат и пример вызова этой функции с помощью "Вызова по имени" в Java или C++?

Я просто прошел тест для своего класса языков программирования и наткнулся на этот вопрос:

Предполагая вызов по имени, каковы результаты следующего кода:

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++?

1 ответ

Решение

В вызове по имени выражения, используемые в качестве аргументов, подставляются непосредственно в вызываемую функцию. Они не оцениваются перед вызовом функции, но заменяются в каждом месте, где параметр встречается в функции.

Это означает, что последний звонок 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 возвращается.

Другие вопросы по тегам