기타/컴퓨터공학

call by value, call by reference, call by value result, call by name

바로이순간 2011. 12. 9. 01:40

[[ 1 ]]
===========================================
다음 프로그램에서 인자전달방법을
call by value,
call by value result,
call by reference로하였을 때,
각 계산과정을 설명하고, 출력결과를 쓰시오.
===========================================
program X;
   integer m;  {전역변수}
   procedure Y(n:integer)
      begin
         n:=n+1;
         write(m,n)
      end;
   begin {start main}
      m:=1;
      Y(m);
      write(m)
   end.

 

1. call by value:

 

1 2 1

 

Y를 호출할때 인자 m은 값이 복사되어 넘어간다.
Y속에서 인자로 넘어온 n은 m과는 다른 변수이다.

따라서 m,n을 찍으면 1과 2가 찍힌다.
또 메인에서 Y가 끝나고 나서 m을 찍어도 여전히 1이 찍힌다.

 

2. call by value result:

 

1 2 2

 

Y를 호출할때 인자 m은 값이 복사되어 넘어간다.
Y속에서 인자로 넘어온 n은 m과는 다른 변수이다.

 

하지만 Y가 끝나고 나면 원래 인자인 m의 값은
위에서 바뀐 n의 값을 가지게 된다.

 

call by value result 라는 말이 뜻하는 것은
프로시져 안에서는 call by value 처럼 동작하고
프로시져 가 끝나면 call by reference 처럼 동작한다는 것이다.

 

3. call by reference

 

2 2 2

 

Y를 호출할때 인자로 넘어가 m은 Y내부에서는 n으로 인식된다.
둘은 같은 것이다.

 

따라서 Y에서 n의 값을 바꾸면 m의 값도 바뀌게 된다.

 

[[ 2 ]]
===========================================
다음프로그램에서 각 인자전달방법에 따른
계산과정을 설명하고, 출력결과를 적으시오.
===========================================
program X;
   integer G;
   integer array L[1..2];
   procedure Sub(P:integer)
      begin
         P:=3;
         G:=G+1;
         P:=5
      end;
   begin
      L[1]:=3;  L[2]:=1;
      G:=1;
      Sub(L[G]);
      write(L[1],L[2])
   End.
 
(a)   call by value

 

Sub(3)으로 호출이 된다.
   Sub내에서 P의 값은 3 으로 시작한다.
   P는 3이 된다.
   G는 2가 된다.
   P는 다시 5가 된다.
   P는 L[1]이나 L[2]와 관계가 없다.
--------------------------------------
   출력은 3 과 1이 출력된다.

 

(b)   call by reference

 

Sub(L[1])로 호출이 된다.
   Sub내에서는 P는 L[1]을 나타낸다.
   P는 3이 된다. L[1]은 3이 된다.
   G는 2가 된다.
   P는 5가 된다. L[1]은 5가 된다.
-------------------------------------
   출력은 5 와 1이 출력된다.

 

(c)   call by name

 

Sub(L[G])로 호출이 된다.
   Sub내에서는 P는 L[G]를 나타낸다.
   L[G]는 3이 된다. 따라서 L[1]은 3이 된다.
   G는 2가 된다.
   L[G]는 5가 된다. 따라서 L[2]는 5가 된다.
--------------------------------------------
   출력은 3 과 5가 출력된다.
 
(d)   call by value result

 

Sub(3)으로 호출이 된다.
   Sub내에서는 P는 3 으로 시작한다.
   P는 3이 된다.
   G는 2가 된다.
   P는 5가 된다.
--------------------------------------------
   끝나면 L[1]은 5가 된다.
   출력은 5 와 1이 출력된다.

 

[[ 3 ]]
===========================================
다음프로그램에서 각 인자전달방법에 따른
실행과정을 설명하고, 출력결과를 적으시오.
===========================================
Declaration Section
   integer k
   integer array v
   procedure P(a)
      integer a
      begin
         a:=a+1;
         v[k]:=1
         k:=3
         a:=a+1
      end
Execution Part
begin
    v[3]:=6
    v[4]:=8
    k:=4
    call P(v[k])
    write(k,v[3],v[4])
End.
 
(a)  call by value

 

call P(8)
   a는 9가 된다.
   V[4]는 1이 된다
   k는 3이 된다.
   a는 10이 된다.
--------------------------------
   출력은 3 6 1 이 출력된다.
 
(b)  call by value result

 

call P(8)
   a는 9가 된다.
   V[4]는 1이 된다
   k는 3이 된다.
   a는 10이 된다.
--------------------------------
   V[4]는 10이 된다.
   출력은 3 6 10 이 출력된다.
 
(c)  call by reference

 

call P(V[4])
   V[4]는 9가 된다.
   V[4]는 1이 된다
   k는 3이 된다.
   V[4]는 2가 된다.
--------------------------------
   출력은 3 6 2 가 출력된다.
 
(d)  call by name

 

call P(V[k])
   V[4]는 9가 된다.
   V[4]는 1이 된다
   k는 3이 된다.
   V[3]은 7 이 된다.
--------------------------------
   출력은 3 7 1 이 출력된다.