块如何在C++程序中工作

How a block work in a C++ program

本文关键字:程序 工作 C++      更新时间:2023-10-16
#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。

请从这里看评论,如果我用 i=30; 替换 int i=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,在顶部声明。