[英]How a block work in a C++ program
#include<iostream>
using namespace std;
int i=10;
int main()
{
int i=20;
cout<<i<<" "<<::i;
{
int i=30; //from here
cout<<endl<<i<<" "<<::i;
}
cout<<endl<<i<<" "<<::i<<endl;
return 0;
}
输出:
20 10
30 10
20 10
在这里,我无法理解输出中'i'的最后一个值,为什么它是20而不是30。
如果我替换int i = 30,请从这里查看评论。 我= 30; 。
现在的输出是:
20 10
30 10
30 10
为什么在这里相对于上述代码更改了最后一个输出值“ i”。
最后,最重要的问题是使用块的用途是什么?
在此程序中,您有三个称为i
不同变量:
main
的本地人,以及 main
一个街区内的另一个本地人。 在该块内,当您引用i
,您将获得在该块内定义的局部变量。 在该块之外(包括其后),该块中的变量不可见,因此当您引用i
您会在main
本身中定义一个变量。 在所有情况下, ::i
指全局变量。
当您在块中将int i=30
更改为i=30
时,就不再在块内创建新变量; 相反,您要修改在main
顶部定义的i
变量,该变量与块末尾后的输出语句所看到的变量相同。
这正是范围界定的工作原理。 在i
的内心最块是一个完全不同的i
不是块外的一个,它恰好具有相同的名称。 这引入了名称重影 。
如果您打算使用原始变量,则不要再次将其声明为int
,或者您要定义一个新变量。 如果您打算使用新变量,请为其选择其他名称。
{
int i=30; //from here
cout<<endl<<i<<" "<<::i;
}
您正在创建一个等于30的局部变量i。局部变量i具有块作用域。 这将覆盖外部的变量i。 一旦不在括号内,则将删除局部变量i或它不在范围内。
更改后,
{
i=30; //from here
cout<<endl<<i<<" "<<::i;
}
它指的是同一变量。因此,无需创建新的局部变量。 您只是分配i = 30。
而::i
则是在顶部声明具有文件范围的全局变量i。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.