如果使用动态范围,以下程序的输出是什么?
void func1()
{
int a,b;
a=6;
b=8;
func2();
a=a+b+c;
printf(a);
}
void func2(){
int b,c;
b=4;
c=a+b;
a+=11;
printf(c);
}
void main(){
a=3;
b=5;
c=7;
func1();
}
我尝试应用动态范围概念。据此,产量为10,32。但结果是7,19。有人可以解释我的方法有什么问题吗?
我的方法: -
初始值:a = 3,b = 5,c = 7
在func2中: 宣布新的b,c。 B = 4。 c = a + b将6 + 4 = 10分配给c。 将打印10并且a变为6 + 11 = 17
在func1中: 打印a + b + c,其为17 + 8 + 7 = 32.
答案 0 :(得分:1)
您有三组变量定义:
一个全球int a,b,c;
,
只要没有局部变量定义覆盖它,就会使用它们。
第一个本地int a,b;
,内部和func1
;
第二个本地int b,c;
,内部和func2
;
他们会覆盖全局。
这就是C的工作原理,它产生了这个序列:
在func1中,按时间顺序首先执行,两个局部变量是初始化的,但它们对func2没有影响。
在func2中,本地b
设置为4
然后,本地c
设置为全局a
+本地b
,3 + 4 == 7。
然后全局a
增加到17
输出本地c
为7。
返回func1,本地a
设置为本地a
+本地b
+全局c
,6 + 8 + 7 == 21。
输出本地a
为21。
这正是您观察到的输出。