【问题标题】:Can someone explain why this input code generates the provided output? [closed]有人可以解释为什么这个输入代码会生成提供的输出吗? [关闭]
【发布时间】:2020-03-18 18:55:41
【问题描述】:

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

输入:

#include <iostream>
using namespace std;

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

输出

13,0

【问题讨论】:

  • 你用的是什么教材?您可以在索引中搜索“范围”一词。
  • 另一个要调查的关键字是“shadowing”。
  • @Cornelius Mynhardt 至少为初学者阅读一本关于 C++ 的书。
  • 如果你把一张照片放在另一张照片上然后把它取下来,你再次看到第一张照片就不会感到惊讶了。

标签: c++ scope


【解决方案1】:

你的观察是正确的。

在更深的括号中声明的新变量与外部括号/等中已经存在的变量分开并“隐藏”它们 - 从更深的括号内部,您将很难从外部括号到达外部 x,因为任何写“x”的尝试都意味着 x-from-deeper-brackets,直到更深的括号结束。在更深的括号结束后,“x”将再次表示从外部括号开始的-x。

现在,正如其中一位评论者所说,“从外部括号中隐藏事物的更深/外部括号”的概念正式称为“范围”。我们谈论外部范围,内部/更深的范围。所以,有一个全局范围(任何东西之外的所有松散浮动的东西 - 即using namespace std 在全局范围内),main 函数的范围(它的主体由 {..} 分隔),for 的范围循环,if 正文的范围,等等。

拥有可以隐藏/隐藏范围内事物的范围是一件非常重要的事情,需要习惯,因为它与以下几件事有关:

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

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

..好吧..也许是后一个,'作用域尽头的破坏'..这真的很重要。

第一个,“阴影”,有时甚至被认为有点“邪恶”,因为它要求你不断意识到它是否仍然是你的 X,或者已经是外部 X,或者可能是全局范围内的 X.. 编写时一个程序,你经常选择不冲突的名字,只是为了不必考虑和跟踪。但它是需要的。没有它,您很快就会用完流行的变量名。当您#include 几个库时,您会惊讶地发现有多少变量/函数/类名称 :)

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

【讨论】:

  • 感谢您对问题的详细解释和快速回复。确实有助于理清思路。真的很感激!
【解决方案2】:

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

一旦这个范围退出,在打印 13 之后,它里面的所有东西都不再重要了,因为它不是“在范围内”。它基本上被删除了。
这意味着之后x 将恢复为0 的原始值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 2015-10-28
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 2015-02-04
    相关资源
    最近更新 更多