2017-05-22 5 views
0

J'essaie actuellement de comprendre passé par référence, valeur et nom dans un exemple de problème.Trouble compréhension passer par référence, valeur et nom

procedure practice (x,y,z); interger x,y,z; 
begin 
y=1; 
z=y-x; 
end 

Le code donné ressemble et je suis censé montrer les valeurs finales de n, A [1], A [2] selon la façon dont ils sont passés

A[1] := 1; 
A[2] := 2; 
n = 2; 
practice (A[1], n, A[n]); 

Je crois passé par valeur équivaudrait aux valeurs d'origine car elles restent inchangées mais les deux autres j'ai du mal à comprendre ce qui se passe.

+1

Où avez-vous entendu parler de "pass by name"? Je le vois seulement utilisé par rapport à Algol, une très vieille langue qui pourrait ne plus être utilisée. – Scooter

+0

@Scooter Pascal vient d'Algol alors votre question est sur le point. –

Répondre

4
procedure practice_by_value(x,y,z : integer); 

Dans passe par la valeur - x, y, z sont des variables distinctes de A [1], n, A [2], mais ne reçoivent qu'une copie des valeurs qui étaient dans le correspondant A [1], n, A [2]. Comme ce sont des variables séparées, comme vous le dites, les variables de l'appelant, A [1], n, A [2] sont inchangées si des modifications sont apportées à x, y ou z.

procedure practice_by_reference(var x,y,z : integer); 

Avec référence passe par - x, y, z devenir des pseudonymes ou des alias pour A [1], n, A [2]. Toutes les opérations sur x, y, z sont les mêmes que si cette opération avait été effectuée sur A [1], n ou A [2]. Donc, si vous modifiez x, y, z dans la procédure, vous modifiez réellement A [1], n, A [2] dans l'appelant. Je ne suis pas familier avec «passer par le nom» en Pascal.

var 
    A : array[1.. 10] of integer; 
    n :integer; 

procedure practice_by_value (x,y,z : integer); 
begin 
    y := 1; 
    z := y-x; 
end; { practice_by_value } 

procedure practice_by_reference(var x,y,z : integer); 
begin 
    y := 1; 
    z := y-x; 
end; 

begin 
    A[1] := 1; 
    A[2] := 2; 
    n := 2; 
    practice_by_value (A[1], n, A[n]); 
    writeln('after pass by value: ',A[1],' ',n,' ',A[2]); 
    practice_by_reference(A[1],n,A[n]); 
    writeln('after pass by reference : ',A[1],' ',n,' ',A[2]); 
end. 

after pass by value: 1 2 2 
after pass by reference: 1 1 0 
+1

Il n'y a pas de "passer par le nom" en Pascal. –

+0

prend tout son sens maintenant merci! – sippycup