c++ - 动态和静态范围程序差异

int x;

int main() {
   x = 14;
   f(); 
   g();
}

void f() {
   int x = 13;
   h();
}

void g() {
   int x = 12;
   h();
}

void h() {
   printf("%d\n",x);  
}

如果使用静态作用域,结果是什么?如果使用动态范围,结果是什么?

现在,如果我正确理解了作用域,静态作用域和动态作用域之间的区别在于,静态使变量成为类的局部变量。所以值 x 将是 void f()void g()int main () 的本地值和动态将使它们在全局范围内可用。我只是不确定如何将其应用于此代码。如果使用静态范围,它是否只打印最后一个值(来自 void g() 的 12),而动态范围将使用 x 的所有值?

我对范围界定的实际工作方式有点困惑。我知道 C 虽然使用静态范围。

最佳答案

静态作用域意味着 x 指的是 x 声明的最内层声明范围 有一个。由于 h 是在全局范围内声明的,所以最里面的 x 是全局范围内的(它无法访问 x 中的fg,因为它没有在其中声明),所以程序打印 14 两次。

动态范围意味着 x 指的是在最近的 调用堆栈帧 中声明的 x。如果 C 使用动态范围,h 将使用 fg 中的 x - 无论哪个调用它- 所以程序会打印 1312.

https://stackoverflow.com/questions/19461503/

相关文章:

c++ - 三元表达式中的逗号混淆

c++ - 如何在 Windows 上找到 Qt5 CMake 模块

c++ - C++ 标准是否对 float 的表示做了任何规定?

c++ - 虚函数默认参数行为

c++ - GCC 4.x/C++11 中的 std::string 引用计数了吗?

c++ - 什么是 C++ 内联类?

c++ - 析构函数可以是最终的吗?

c++ - 库已链接,但引用未定义

c++ - 从基类构造函数调用纯虚函数

c++ - 如何使用 C++ 模板减少编译时间