首页 > 解决方案 > 以下使用动态范围的程序的输出

问题描述

如果使用动态范围,以下程序的输出是什么?

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。

标签: cdynamic

解决方案


您有三组变量定义:

一个 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。

这正是您观察到的输出。


推荐阅读