0

J'ai donc ce morceau de code Pascal:appel Comprendre par la valeur résultat et d'appel par référence differnce

program P; 

var a: array [1..2] of Integer; 
var i :Integer; 
var k :Integer; 

procedure update(x,y,z: Integer); 
    begin 
     x := x+1; 
     y := x*2; 
     x := y;  
     k := x; 
    end 


begin 
    a[1] := 5; a[2] := 10; 
    k := 3; 
    for i:=1 to 2 do 
     begin 
      update(a[i],a[2],k); 
      print(a); 
      print(k) 
     end 
end. 

(supposons que « print » imprime les éléments du tableau séparés par des espaces, puis imprime une nouvelle ligne et aussi pour un nombre entier il l'imprime juste)

Et j'essaye de comprendre comment différent la sortie serait si l'appel de fonction était par valeur-résultat ou par référence. De toute évidence, s'il s'agissait d'une simple valeur, il est facile de dire que la procédure ne ferait aucune différence sur le paramètre réel, c'est-à-dire que la sortie (en valeur) devrait être: 5 10 3 5 10 3.

Je pense que si c'était valeur-résultat il aurait été, au moins la première itération: 12 12 12. au cas de par référence je me suis trompé. Qu'est-ce que ce serait?

+0

Pourquoi est-ce marqué C++ et pas Pascal? –

+0

désolé, mon mauvais, même si cela ne fait pas vraiment de différence que le sujet de la question n'a rien à voir avec la langue dans laquelle il est écrit. –

+0

Vous avez inclus le code afin que les étiquettes font toute la différence. –

Répondre

1

Vous n'avez déclaré aucun paramètre de variable. La variable K sera modifiée, mais cela ne compte pas dans ce contexte et est généralement considérée comme une mauvaise pratique.

PROGRAM ParamTest; 

VAR 
    A, B : Integer; 

PROCEDURE TestProc(X : Integer; VAR Y : Integer; CONST Z : Integer); 

BEGIN 
    X := X + Z; 
    Y := Y + Z; 
END; 

BEGIN 
    A := 10; 
    B := 10; 
    TestProc(A, B, 5); 
    WriteLn(A, ' ', B); 
END. 
  • X: Appel par valeur
  • Y: Appeler par référence
  • Z: Appel en constante

La sortie de ce programme doit être 10 15. En déclarant Z comme paramètre constant, vous promettez au compilateur que vous ne modifiez pas cette valeur. La variante de procédure suivante devrait donner une erreur lors de la compilation.

PROCEDURE TestProc(X : Integer; VAR Y : Integer; CONST Z : Integer); 

BEGIN 
    X := X + Z; 
    Y := Y + Z; 
    Z := Z + 1; 
END;