Pass-by-name и Pass-by-value-result - PullRequest
       4

Pass-by-name и Pass-by-value-result

1 голос
/ 31 марта 2012

В своем классе языков программирования я пытаюсь понять, как работают передача по имени и передача по значению.Я понимаю, что они почти не используются в основных языках, но я хочу понять, как они работают.В качестве примера (не зависит от языка):

void swap(int a, int b){
    int t;
    t = a;
    a = b;
    b = t;
}
void main() {
    int val = 1, list[5] = {1, 2, 3, 4, 5}
    swap(val, list[val]); 
}

Какими будут значения val и list после вызова swap как для pass-by-value-result, так и для pass-by-name.

Объяснение тоже было бы здорово.

Из того, что я вывел, он получил значение-результат: val = 2, list = {1,1,3,4,5} и name: val = 3,список = {1,2,1,4,5}.Я очень не уверен в этих результатах.

Кроме того, это меняет способ работы обоих этих методов, когда массив передается в отличие от одного целого?Спасибо за любую помощь заранее.

Ответы [ 2 ]

0 голосов
/ 16 мая 2013

этот код объясняет одну из проблем передачи по имени вот почему

в свопе это то, что происходит

void swap(int a, int b){
    int t;
    t = a; //t=val; t=1
    a = b;// val=list[val]; val=list[1]=2
    b = t;// list[val]=t; list[2]=1
}
void main() {
    int val = 1, list[5] = {1, 2, 3, 4, 5}
    swap(val, list[val]); 
}

как вы можете видеть, значение val изменилось в val = list [val], и это уже не тот вал, который вы уже передали

как для передачи по значению результата

void swap(int a=1, int b=2){
    int t;
    t = a; //a=1 so t=1
    a = b; //b=2 so a=2
    b = t; //b=1 so it and it return the right parameter so list[1]=2
}

надеюсь, это помогло

0 голосов
/ 31 марта 2012

Если вы подразумеваете передачу по имени как передачу по ссылке, то результат будет таким же, как по значению.
Это потому, что вы только переключаете ссылки между val и val в списке позиций. Вы не передаете ссылку на массив. Думайте о переменной как о указателе на блок памяти, который содержит значение.

...