2013-04-07 55 views
-2

鑑於這種C代碼:輸出的像調用C代碼參照

int x=12,y=10; 

void tswap(int pa, int pb) { 
    int tmp; 
    tmp=pa; 
    pa=pb; 
    pb=tmp; 
    x=x+pa; 
    x=x-pb; 
    y++; 
    printf("%d %d %d %d\n",pa,pb,x,y); 
} 

int main() { 
    int a=4; 
    tswap(x,a); 
    printf("%d %d %d\n",x,y,a); 
    return 0; 
} 

我必須弄清楚什麼,如果C中的call-by-參考它會打印。

這是我的期望。
首先
X = 12 Y = 10且a = 4

after tswap(12,4): 
pa=x=12 pb=a=4 

after tmp=pa: 
tmp=pa=x=12 
----------- 
after pa=pb: 
tmp=x=12 
pa=pb=a=4 
------------- 
after pb=tmp: 
pb=tmp=x=12 
pa=a=4 

after x=x+pa 
x=16 
------------ 
and after x=x-pb and y++ 
x=4,y=11 

因此,我認爲X = 4,PB = 12,PA = 4,Y = 11;但答案是-4 12 -4 11.我哪裏錯了?

+3

C中沒有引用引用。要找出你的代碼的作用,只需編譯並運行它。 – 2013-04-07 19:33:18

+0

@OliCharlesworth我知道在C語言中並沒有引用引用,也就是說在頂部。「c代碼就像」所以,只要認爲一個代碼類似的語法與C和具有調用參考 – 2013-04-07 19:35:45

+0

@OliCharlesworth什麼會你調用'int a = 1,b = 2; tswap(&a,&b);'帶'void tswap(int * pa,int * pb){...}'? – A4L 2013-04-07 19:37:29

回答

1

由於沒有遞歸在這裏,所有的變量具有不同的名稱,我們可以「騙」了一下,改變局部變量,全局(因爲這不會造成任何名稱衝突):

由於tswap只叫一次,我們知道它pa參數總是別名x,其pb參數總是別名爲a。所以,我們就可以擺脫的參數,與變量,它們的別名替換它們:

int x=12, y=10; 
int tmp; 
int a; 

void tswap() { 
    tmp=x; 
    x=a; 
    a=tmp; 
    x=x+x; 
    x=x-a; 
    y++; 
    printf("%d %d %d %d\n",x,a,x,y); 
} 

int main() { 
    a=4; 
    tswap(); 
    printf("%d %d %d\n",x,y,a); 
    return 0; 
} 

在這一點上,這只是普通的C代碼;我們不再有任何參數,因此「傳遞引用」和「傳值」是等價的。跟蹤:

int x=12, y=10; 
int tmp; 
int a; 

void tswap() { 
    tmp=x;  /* x=12, y=10, tmp=12, a=4 */ 
    x=a;   /* x=4, y=10, tmp=12, a=4 */ 
    a=tmp;  /* x=4, y=10, tmp=12, a=12 */ 
    x=x+x;  /* x=8, y=10, tmp=12, a=12 */ 
    x=x-a;  /* x=-4, y=10, tmp=12, a=12 */ 
    y++;   /* x=-4, y=11, tmp=12, a=12 */ 
    printf("%d %d %d %d\n",x,a,x,y); /* prints "-4 12 -4 11" */ 
} 

int main() { 
    a=4;  /* x=12, y=10, tmp is uninitialized, a=4 */ 
    tswap(); /* x=-4, y=11, tmp=12, a=4; prints "-4 12 -4 11" */ 
    printf("%d %d %d\n",x,y,a); /* prints "-4 11 4" */ 
    return 0; 
}