105年地方特考四等程式設計概要
四、如果我們採取不同參數傳遞的方法,請回答下面程式執行的結果:(每小題4分,共12分) (一) pass-by-reference (二) pass-by-name (三) pass-by-value-result
|
答:
(一)pass-by-reference
#include <stdio.h> int y = 1, x = 1; int fun(int& a, int& b) { b += a; a = b + x; return a; } void main() { int x = 2; y = fun(x, y) + y; printf("x = % d, y = % d", x, y); } |
執行結果:
x = 4, y = 7
說明:
int y = 1, x = 1;
y = fun(x, y)+y;
範圍 |
變數 |
值 |
global |
x |
1 |
global |
y |
1 |
main/fun |
x, a |
2 |
main/fun |
y, b |
1 |
int fun(int a, int b) {b += a; a = b+x; return a;}
執行b += a:
b = b+a
範圍 |
變數 |
值 |
global |
x |
1 |
global |
y |
1 |
main/fun |
x, a |
4 |
main/fun |
y, b |
3 |
執行a = b+x:
範圍 |
變數 |
值 |
global |
x |
1 |
global |
y |
1 |
main/fun |
x, a |
4 |
main/fun |
y, b |
3 |
y = fun(x, y)+y = 4+3 = 7
結果是 x = 4, y = 7。
(二)pass-by-name
y = fun(x, y)+y;
範圍 |
變數 |
值 |
global |
x |
1 |
global |
y |
1 |
main/fun |
x, a = x |
2 |
main/fun |
y, b = y |
1 |
int fun(int a, int b) {b += a; a = b+x; return a;}
執行b += a:
b = b+a
範圍 |
變數 |
值 |
global |
x |
1 |
global |
y |
1 |
main/fun |
x, a = x |
2 |
main/fun |
y, y = y+x |
3 |
執行a = b+x:
範圍 |
變數 |
值 |
global |
x |
1 |
global |
y |
1 |
main/fun |
x, x = (y+x)+x |
5 |
main/fun |
y, y = y+x |
3 |
副程式中所有型式參數的名稱以實際參數的名稱來替代。
y = fun(x, y)+y = 5+3 = 8
結果是 x = 5, y = 8。
(三)pass-by-value-result
int y = 1, x = 1;
y = fun(x, y)+y;
範圍 |
變數 |
值 |
global |
x |
1 |
global |
y |
1 |
main |
x |
2 |
main |
y |
1 |
fun |
a |
2 |
fun |
b |
1 |
int fun(int a, int b) {b += a; a = b+x; return a;}
執行b += a:
b = b+a
範圍 |
變數 |
值 |
global |
x |
1 |
global |
y |
1 |
main |
x |
2 |
main |
y |
1 |
fun |
a |
2 |
fun |
b |
3 |
執行a = b+x:
範圍 |
變數 |
值 |
global |
x |
1 |
global |
y |
1 |
main |
x |
2 |
main |
y |
1 |
fun |
a |
4 |
fun |
b |
3 |
當副程式執行完畢時,形式參數的值傳回給實際參數。形式參數的值 a 傳回給實際參數 x,形式參數的值 b 傳回給實際參數 y。
範圍 |
變數 |
值 |
global |
x |
1 |
global |
y |
1 |
main |
x |
4 |
main |
y |
3 |
fun |
a |
4 |
fun |
b |
3 |
y = fun(x, y)+y = 4+1 = 5。第一個 y 是實際參數,第二個 y 是全域變數。
結果是 x = 4, y = 5。