Предположим, у нас есть следующий код на языке, который очень похож на C.
int A[2];
A[0]=4;
A[1]=7;
void f(int x, int y) {
x++; A[1]++; y++;
printf(x, y, A[0], A[1]);
}
void main() {
int k = 0;
f(k, A[k]);
print(k, A[0], A[1]);
}
Я хочу определить вывод этой программы.Я не очень хорошо понял разницу между вызовом по имени и методом расширения по вызову.
Итак, в методе call-by-name k инициализируется значением 0, а затем вызывается функция f()
.x становится равным «k», а y становится равным «A [k]».Первая команда в вызываемой функции - x++
, которая увеличивает значение «k» на 1. Таким образом, k становится равным 1. Затем A [1] увеличивается, поэтому A [1] становится 7 + 1 = 8.Ни один из x, y не затронут.Наконец, у нас есть команда y++
, которая увеличивает значение «A [k]» на 1, поэтому оно увеличивает значение A [1] (поскольку теперь k = 1) на 1, поэтому A [1] становится теперь8 + 1 = 9.
Затем f()
печатает: 1,9,4,9
И затем мы возвращаемся к функции main()
, которая печатает: 1,4,9
Итакесли я не ошибаюсь, вывод программы - 1,9,4,9,1,4,9.
Но чем отличается расширение по вызову от макроса Этот метод?Что это меняет?