作者jtafstn (DJ DATA(?))
看板TransCSI
标题[问题] c的变数有效范围题
时间Wed Jun 29 16:54:33 2011
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
1F:→ longlongint:a=11,b=3 06/29 17:44
2F:→ longlongint:a=12,b=51 06/29 17:45
3F:→ longlongint:a=15,b=9 06/29 17:45
4F:→ longlongint:a=12,b=36 06/29 17:45
5F:→ longlongint:至少我编译出来是这样(汗 06/29 17:45
6F:→ longlongint:一个变数的生命周期只在宣告的范围内 block { } 06/29 17:46
7F:→ longlongint:若以变数名称叫一个变数,以生命范围最小的变数优先 06/29 17:47
8F:→ longlongint:把最大的a改成AG main里面的a 改成AM 以此类推 06/29 17:48
9F:→ longlongint:然後你去想想那个a是哪个a b是哪个b 06/29 17:48
10F:→ longlongint:更正 是"可参考到的变数里面" 生命范围最小的那个 06/29 17:49
11F:→ longlongint:所以add动到的是全区的b 06/29 17:49
12F:→ longlongint:有错请鞭... 06/29 17:56
13F:→ jtafstn:原来如此@@ 谢谢你> < 06/29 18:12
14F:→ longlongint:不客气~~ 06/29 18:44
对不起我又有问题了|||
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)
15F:→ longlongint:sub1里面有a++所以没办法编译 我可以把它修成x++吗? 06/30 21:32
16F:→ longlongint:底下的sub2不用分号 06/30 21:33
17F:→ longlongint:执行结果 06/30 21:34
18F:→ longlongint:1th time 1,5,9,6 06/30 21:34
19F:→ longlongint:2th time 2,5,10,2 06/30 21:34
20F:→ longlongint:3th time 3,5,11,-2 06/30 21:35
21F:→ longlongint:dev c++下载网址 06/30 21:35
22F:→ longlongint:网址太长了 google找dev c++ 06/30 21:36
23F:→ longlongint:安装之後 把程式码前面加标头档 06/30 21:36
24F:→ longlongint:main()的最後面加 system("pause"); 06/30 21:36
25F:→ longlongint:编译看看 06/30 21:36
26F:→ longlongint:sub2()是传值所以a不会变 06/30 21:38
27F:→ longlongint:sub3(&b)是传地址 所以改变z会动到b 06/30 21:39
28F:→ longlongint:sub1() 因为x 是static函数,值会被保留到以後的呼叫 06/30 21:39
29F:→ longlongint:p是全区变数你应该很了解了@@+ 06/30 21:40
30F:→ longlongint:x每次呼叫皆会加一 所以是 1 2 3 06/30 23:28
31F:→ longlongint:a完全不变 一直是5 06/30 23:28
32F:→ longlongint:b每次都+1 所以 9 10 11 06/30 23:29
33F:→ longlongint:p每次都减掉(a-1) 所以一直减四 所以是 6 2 -2 06/30 23:30
34F:→ longlongint:其实实际写程式不会搞得这麽混乱,误导看码的人干嘛XD 06/30 23:36