[[ 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 이 출력된다.
'기타 > 컴퓨터공학' 카테고리의 다른 글
32bit와 64비트의 차이(?) (0) | 2011.12.25 |
---|---|
초보자들의 질문 (0) | 2011.12.15 |
프로그램 작성법 (0) | 2011.12.08 |
응답없음의 원리 [네이버 지식인의 질문에서] (0) | 2011.12.03 |
컴퓨터 공학 준비에 대해서요 [예비 대학생의 질문] (0) | 2011.12.03 |