c - 以下使用动态范围的程序的输出
问题描述
如果使用动态范围,以下程序的输出是什么?
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。
解决方案
您有三组变量定义:
一个 global int a,b,c;
,
只要没有局部变量定义覆盖它,就会使用它们。
首先是本地int a,b;
、内部和for func1
;
第二个局部 int b,c;
,内部和for func2
;
他们将覆盖全局变量。
这就是 C 的工作方式,它导致以下序列:
在 func1 中,按时间顺序首先执行,两个局部变量被初始化,但它们对 func2 没有影响。
在 func2 中,将 localb
设置为 4。
然后将 localc
设置为 global a
+ local b
,3 + 4 == 7。然后将 globala
增加到 17。将
local 输出c
为 7。
回到 func1,locala
设置为 local a
+ local b
+ global c
,6 + 8 + 7 == 21。
输出 locala
为 21。
这正是您观察到的输出。
推荐阅读
- javascript - 如何根据其他变量的结果设置变量名
- java - 打印出一个数字塔
- php - 如何通过 Timber 为 Twig 制作自定义逃生器?
- node.js - 静态解析符号值时遇到 ANGULAR 错误
- rxjs - 将 catchError 与 RxFire firestore collectionData 一起使用时遇到问题
- java - 领域数据库不写入数据
- java - 如何让 HttpClient 返回状态码?
- matlab - 从Matlab中的矩阵中提取每个地区的数据
- java - 如何离开 if 语句中的 while 循环并继续执行 if 语句?
- css - 这个 flexbox 布局中的 CSS 计算从何而来?