當我們執行以下代碼時:
int x=1,y=0;
printf("%d,x=%dy=%d",x=y,x,y) ;
會出現結果:
0,x=0y=0
也就是說在printf語句中由於x=y的影響,x的值被改變了。
但是如果我們寫一個函數來完成類似的動作:
定義一個swap函數來交換xy變量的值:
int swap(int *a,int *b){
int t;
t=*a;
*a=*b;
*b=t;
return 1;
}
之後我們用printf來輸出,其中會用到swap函數,我們來看看swap函數的運行是否會影響接下來對xy的輸出:
int main(){
int x=1,y=0;
printf("return of swap is %d\tx=%d,y=%d\n",swap(&x,&y),x,y);
return 0;
}
上面這段代碼的輸出如下:
return of swap is 1 x=1,y=0
注意到了麼?xy的值並沒有交換。
難道swap函數沒有執行麼?為什麼會有返回值呢?
我們再次輸出xy的值試試:
在return語句之前增加語句:
printf("\t\t\tx=%d,y=%d",x,y);
return of swap is 1 x=1,y=0
x=0,y=1
hey,xy的值又交換了!但是出現了延遲。
立即交換和有延時的交換之間的區別是為什麼呢?
不是什麼延遲,而是C語言是從後往前求函數參數的值,並且把值送入了堆棧。
所以printf("return of swap is %d\tx=%d,y=%d\n",swap(&x,&y),x,y);
x y都先被放入了堆棧,然後才執行的swap,x y是復制到堆棧上的,所以再更改它們不會影響堆棧上它們的副本了。
printf("x=%d,y=%d\treturn of swap is %d\n",x,y,swap(&x,&y));
這樣寫,先執行swap,所以就是交換了。