기타/컴퓨터공학

매개변수 전달 방식

바로이순간 2013. 5. 21. 12:06

안녕하세요.

매개변수 전달 방식을 공부하는데, 잘 모르겠네요.

밑의 프로그램으로  func()함수를 호출한 이후에

 

#define N 100

int a[N];


void fun(int x, int y, int j)

{

        i=i*2

        x=x+10

        y=y+10

}


main()

{

        int I, j;

        j=10

        for(i=0;i<N;i++) a[i]=i;


        func(a[j],a[j],j);

}

 

call by reference을 사용했을 때,        j=?, a[?]=?

call by value을 사용했을 때,               j=?, a[?]=?

call by value result을 사용했을 때,     j=?, a[?]=?

call by name을 사용했을 때,              j=?, a[?]=?

?의 값을 알고 싶습니다.

 

초보자를 가르치신다는 생각으로 각각 전달 방식에 대해서 값이 변하는 과정을

가능한 쉽고 자세하게 설명부탁드립니다.

 

ps

제가 알고 싶은 것은 다른 프로그램이 아닌 제가 제시한 프로그램으로 4가지 매개변수 

전달 방식을 알고 싶은 것입니다. c언어가 위의 4가지를 다 지원하지 않으니까  

c언어와 유사한 문법을 가진 언어라고 생각하고 설명해 주시면 안 될까요?  

(문제집에 나온 문제인데, 해설이 없어서요.ㅠㅠ)

-----------------------------------------------------------------------------------------

c언어는 call by value 밖에는 지원하지 않습니다.

c++언어는 call by value와 call by reference 를 지원합니다.


따라서 아래에서 설명할 때는 파스칼(혹은 유사) 을 사용하여 설명하였습니다.

아래 설명을 이해하고 나면 call by value, call by reference, call by value result,

call by name 이 이해되리라고 생각합니다.


참 call by result  는 call by value result 를 의미하는 것이라고 봅니다.


 [[ 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 이 출력된다.