有人可以解释为什么这个输入代码会生成提供的输出吗?

Can someone explain why this input code generates the provided output?

我需要帮助来理解下面 C++ 代码中大括号的功能。看着它,它似乎在大括号中的语句中局部初始化变量,因此不会影响 main 函数中的任何全局变量。我想了解的是为什么。我的教科书对此并不清楚。

输入:

#include <iostream>
using namespace std;

int main()
{
    int x = 0;
    {
        int x = 13;
        cout << x << ",";
    }
    cout << x << endl;
    return 0;
}

输出:

13,0

int x = 0; 后的花括号定义了一个新的作用域,如评论中所述。
在此范围内,您正在定义一个新的 x 变量。 (而不是引用旧的,x = 13,没有类型名称)

一旦这个范围退出,就在打印 13 之后,它里面的所有东西都不再重要,因为它不是 "in-scope"。它基本上被删除了。
这意味着之后 x 回到 0 的原始值。

您的观察是正确的。

在更深的括号中声明的新变量与外部 brackets/etc 和 'shadow' 中已经存在的变量分开 - 从更深的括号内你将很难到达外部 x 从外括号开始,因为任何写 "x" 的尝试都意味着 x-from-deeper-brackets,直到更深的括号结束。更深的括号结束后,"x" 将再次表示 -x-from-outer-brackets。

现在,正如其中一位评论者所说,"deeper/outer brackets that shadow things from outer brackets" 的概念正式称为 "scope"。我们谈论外部范围,inner/deeper 范围。所以,有一个全局范围(所有在任何东西之外的松散浮动的东西 - 即 using namespace std 在全局范围内),main 函数的范围(它的主体由 {..} 分隔) ,for 循环的范围,if 主体的范围,等等。

拥有范围 hide/shadow 来自范围之外的东西,习惯是一件非常重要的事情,因为它与以下几件事有关:

  • 您可以访问的控制变量(如您的示例:外层 x 与更深层 x)
  • 当对象被销毁时(例如:内部 x 可能实际上在内部 } 结束时被销毁)

这两个相对简单的概念(甚至可能听起来不重要)实际上为进一步的技术和可能性开辟了道路,这些技术和可能性在几乎所有 C++ 程序中都得到广泛使用。

..好吧..也许是后一个,'destruction at end of scope'..记住这一点真的很重要。

第一个,'shadowing',有时甚至被认为有点 'evil' 因为它需要你不断地意识到它是否仍然是你的 X,或者已经是外部 X,或者可能来自全局范围.. 在编写程序时,您通常会选择不会冲突的名称,只是为了不必思考和跟踪它。但这是需要的。没有它,你很快就会 运行 失去流行的变量名。当您 #include 多个库时,您会惊讶于已经有多少 variable/function/class 个名称:)

至于主要问题What I am trying to understand is why.答案只能是一个:因为语言就是这样设计的。很方便。