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

作者: jtafstn (DJ DATA(?))   2011-06-29 16:54:33
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卻是動全域變數?
拜託大家了,謝謝
作者: longlongint (華哥爾)   2011-06-29 17:44:00
a=11,b=3a=12,b=51a=15,b=9a=12,b=36至少我編譯出來是這樣(汗一個變數的生命週期只在宣告的範圍內 block { }若以變數名稱叫一個變數,以生命範圍最小的變數優先把最大的a改成AG main裡面的a 改成AM 以此類推然後你去想想那個a是哪個a b是哪個b更正 是"可參考到的變數裡面" 生命範圍最小的那個所以add動到的是全區的b有錯請鞭...
作者: jtafstn (DJ DATA(?))   2011-06-29 18:12:00
原來如此@@ 謝謝你> <
作者: longlongint (華哥爾)   2011-06-29 18:44:00
不客氣~~sub1裡面有a++所以沒辦法編譯 我可以把它修成x++嗎?底下的sub2不用分號執行結果1th time 1,5,9,62th time 2,5,10,23th time 3,5,11,-2dev c++下載網址網址太長了 google找dev c++安裝之後 把程式碼前面加標頭檔main()的最後面加 system("pause");編譯看看sub2()是傳值所以a不會變sub3(&b)是傳地址 所以改變z會動到bsub1() 因為x 是static函數,值會被保留到以後的呼叫p是全區變數你應該很了解了@@+x每次呼叫皆會加一 所以是 1 2 3a完全不變 一直是5b每次都+1 所以 9 10 11p每次都減掉(a-1) 所以一直減四 所以是 6 2 -2其實實際寫程式不會搞得這麼混亂,誤導看碼的人幹嘛XD

Links booklink

Contact Us: admin [ a t ] ucptt.com