[問題] c的變數有效範圍題(對不起我又有問題了QQ)

看板TransCSI作者 (DJ DATA(?))時間13年前 (2011/06/29 16:54), 編輯推噓0(0034)
留言34則, 2人參與, 最新討論串1/1
int a=1,b=2; int add(int x,int y) { int a=100; a=x+y; b=x-y; printf("a=%d,b=%d\n",a,b); return(x*y); } void main(void) { int a=10 a++;b++; printf(("a=%d,b=%d\n",a,b); { int b=50 a++;b++; printf(("a=%d,b=%d\n",a,b); } b=add(a,b); printf(("a=%d,b=%d\n",a,b); } 想請問四次印出來的結果是 a=15,b=9 a=11,b=3 a=12,b=51 a=12,b=36 這樣嗎? 另外再問一下 add跟main有宣告a,所以a會另外產生位置給區域變數裡的a 可是副程式ab都有動到,為什麼a是動區域變數b卻是動全域變數? 拜託大家了,謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.71.78.79

06/29 17:44, , 1F
a=11,b=3
06/29 17:44, 1F

06/29 17:45, , 2F
a=12,b=51
06/29 17:45, 2F

06/29 17:45, , 3F
a=15,b=9
06/29 17:45, 3F

06/29 17:45, , 4F
a=12,b=36
06/29 17:45, 4F

06/29 17:45, , 5F
至少我編譯出來是這樣(汗
06/29 17:45, 5F

06/29 17:46, , 6F
一個變數的生命週期只在宣告的範圍內 block { }
06/29 17:46, 6F

06/29 17:47, , 7F
若以變數名稱叫一個變數,以生命範圍最小的變數優先
06/29 17:47, 7F

06/29 17:48, , 8F
把最大的a改成AG main裡面的a 改成AM 以此類推
06/29 17:48, 8F

06/29 17:48, , 9F
然後你去想想那個a是哪個a b是哪個b
06/29 17:48, 9F

06/29 17:49, , 10F
更正 是"可參考到的變數裡面" 生命範圍最小的那個
06/29 17:49, 10F

06/29 17:49, , 11F
所以add動到的是全區的b
06/29 17:49, 11F

06/29 17:56, , 12F
有錯請鞭...
06/29 17:56, 12F

06/29 18:12, , 13F
原來如此@@ 謝謝你> <
06/29 18:12, 13F

06/29 18:44, , 14F
不客氣~~
06/29 18:44, 14F
對不起我又有問題了||| int p=10; main ( ) { int sub1(void); int sub2(int); int sub3(int *); int a=5,b=8,i; for(i=1;i<=3;i++) { sub2(a);sub3(&b); printf("%d th time %d,%d,%d,%d\n",i,sub1(),a,b,p); } } int sub1(void) { static int x=0; a++;return (x); } void sub2(int y); { y--;p-=y; } void sub3(int *z) { *z+=1; } 輸出的部分我算出來是 1 th time1 5 9 1 可是答案給 1 th time1 5 9 6 想問一下p在整個程式的變化過程詳細 還想問sub3(&b)跟sub3(int *)的部分 是先把z指向p 然後b又指向z 所以b會取到p的值 是這樣嗎@@ 不好意思麻煩了 ※ 編輯: jtafstn 來自: 219.71.78.79 (06/29 22:01)

06/30 21:32, , 15F
sub1裡面有a++所以沒辦法編譯 我可以把它修成x++嗎?
06/30 21:32, 15F

06/30 21:33, , 16F
底下的sub2不用分號
06/30 21:33, 16F

06/30 21:34, , 17F
執行結果
06/30 21:34, 17F

06/30 21:34, , 18F
1th time 1,5,9,6
06/30 21:34, 18F

06/30 21:34, , 19F
2th time 2,5,10,2
06/30 21:34, 19F

06/30 21:35, , 20F
3th time 3,5,11,-2
06/30 21:35, 20F

06/30 21:35, , 21F
dev c++下載網址
06/30 21:35, 21F

06/30 21:36, , 22F
網址太長了 google找dev c++
06/30 21:36, 22F

06/30 21:36, , 23F
安裝之後 把程式碼前面加標頭檔
06/30 21:36, 23F

06/30 21:36, , 24F
main()的最後面加 system("pause");
06/30 21:36, 24F

06/30 21:36, , 25F
編譯看看
06/30 21:36, 25F

06/30 21:38, , 26F
sub2()是傳值所以a不會變
06/30 21:38, 26F

06/30 21:39, , 27F
sub3(&b)是傳地址 所以改變z會動到b
06/30 21:39, 27F

06/30 21:39, , 28F
sub1() 因為x 是static函數,值會被保留到以後的呼叫
06/30 21:39, 28F

06/30 21:40, , 29F
p是全區變數你應該很了解了@@+
06/30 21:40, 29F

06/30 23:28, , 30F
x每次呼叫皆會加一 所以是 1 2 3
06/30 23:28, 30F

06/30 23:28, , 31F
a完全不變 一直是5
06/30 23:28, 31F

06/30 23:29, , 32F
b每次都+1 所以 9 10 11
06/30 23:29, 32F

06/30 23:30, , 33F
p每次都減掉(a-1) 所以一直減四 所以是 6 2 -2
06/30 23:30, 33F

06/30 23:36, , 34F
其實實際寫程式不會搞得這麼混亂,誤導看碼的人幹嘛XD
06/30 23:36, 34F
文章代碼(AID): #1E2kXHAJ (TransCSI)