有人可以解释为什么这个输入代码会生成提供的输出吗?
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.
答案只能是一个:因为语言就是这样设计的。很方便。
我需要帮助来理解下面 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.
答案只能是一个:因为语言就是这样设计的。很方便。