Специальные стили передачи параметров: Call-By-Value, Call-By-Name и т. Д. - PullRequest
3 голосов
/ 08 декабря 2010

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

Рассмотрим следующую программу, написанную на C-подобной нотации:

int i = 1;
A[] = {4, 0, 1, 2};

void mystery05(int from, int to)
{
    int temp;
    temp = A[from];
    A[from] = A[to];
    A[to] = temp;
    i = i + 2;
    to = -1;
}

int main(void)
{
    mystery05(A[i+2], A[i]);
}

В таблице ниже заполните поля соответствующими значениями переменных после вызова mystery05 в main. Каждая строка соответствует определенному стилю передачи параметров (т. Е. Использовать указанный стиль вместо семантики языка Си по умолчанию). Предположим, что массивы проиндексированы от 0.

style               |___i___|__A[0]__|__A[1]__|__A[2]__|__A[3]__| 
call-by-value       |_______|________|________|________|________|
call-by-name        |_______|________|________|________|________|
call-by-reference   |_______|________|________|________|________|
call-by-value-result|_______|________|________|________|________|

Я не уверен, как это сделать, но если бы это была обычная семантика C, я предположил, что ответы будут

i = 3; A [0] = 4; A [1] = 2; A [2] = 1; A [3] = 0

Ответы [ 2 ]

1 голос
/ 08 декабря 2010

@S.Lott: Я думал, что указатели на строки и массивы вызываются по ссылке. Я не прав?

Я согласен: не хочу отвечать на все вопросы. Если у него есть экзамен, он должен быть более осведомленным. Я хотел бы ответить на первую строку, хотя бы просто посмотреть, правильно ли я понял. Так что я могу ошибаться!

Вызов по значению: не изменяет значения, если переменные не являются глобальными и в этом случае они должны быть; как в противном случае процесс может использовать i.

И массив i, и массив A являются глобальными.

То, что происходит в процедуре, меняет значения.

i начинается со значения 1, поэтому значения A [3] и A [1] меняются местами.

A [3] теперь 0, A [1] теперь 2. A [0] и A [2] без изменений.

наконец, я изменил значение на 3

Я думаю, что экзамен пропустил трюк, не спрашивая о значении 'to' после вызова proc.

0 голосов
/ 08 декабря 2010

вызов по значению - я думаю, - что вы подразумеваете под "обычной семантикой C"

вызов по имени - это то, что C не имеет. Поищи это. Это не "обычная семантика C"

вызов по ссылке предполагает, что все аргументы имеют "&", а параметры - "*". Это не "обычная семантика C", это другая семантика, но легко встроенная в C.

call-by-value-result - это то, что C не имеет. Поищи это.

Каждый отличается. Не принимайте C. Не читайте код, как если бы он был C. Вы должны читать код по-разному, предполагая разные вещи.

...