繁体   English   中英

块在C ++程序中的工作方式

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM