程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程解疑 >> c語言-C語言的陷阱:關於函數參數的“副作用”問題

c語言-C語言的陷阱:關於函數參數的“副作用”問題

編輯:編程解疑
C語言的陷阱:關於函數參數的“副作用”問題

當我們執行以下代碼時:

 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,所以就是交換了。
qq_33233586
qq_33233586
whuKK
caozhy
caozhy
whuKK
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved