[问题] 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