【问题标题】:I know this is basic我知道这是基本的
【发布时间】:2016-10-19 05:37:36
【问题描述】:

(这是问我的问题。) 以下程序的输出是什么?解释你的结果。

int val = 20;

int func1()
{
  int val = 5;
  return val;
}

int func2()
{
  return val;
}

int main()
{
  // (1)
  cout << func1() << endl;

  // (2)
  cout << func2() << endl;
}

Output::

5
20

---我假设它是这样的,因为:---

  • func1 将 val 从 20 更改为 5。

  • func2 没有任何改变。

  • 我相信val是由每个函数修改并单独存储的。

谁能解释一下,告诉我应该看什么主题?

【问题讨论】:

  • 删除func1中的int关键字,你就有了一个赋值(改变了全局变量的值)而不是一个声明(它创建了一个新的局部var并将其初始化为5 )。
  • 基本,没有。这就是 C++。很高兴你运行程序。令人沮丧的是,有多少人问类似的问题却不打扰。
  • 尝试编辑你的问题标题,赋予它一些有意义的意义。

标签: c++ scope int global


【解决方案1】:
int val = 20;

int func1()
{
  int val = 5;
  return val;
}

上面创建了两个变量,名为val。一个是全局的,另一个是 func1 范围内的本地。
当您在func1 的范围内时,本地的val 隐藏了全局的val。因此,您无需更改全局变量的值,而只需返回您存储在本地 val 中的内容。

int func2()
{
  return val;
}

func2 返回全局变量的值(未更改)。这就是为什么您会看到您记下的输出。

如果你想引用全局变量,尽管有一个局部变量,你可以使用范围解析运算符::

int val = 20;

int func1()
{
  int val = 5;
  ::val = 10;
  return val;
}

上面会将全局val设置为10。

【讨论】:

    【解决方案2】:

    func1 将 val 从 20 更改为 5。

    不,它按原样返回局部变量。不改变全局变量。最内层作用域的 var 超过同名的外层 var。

    func2 没有任何改变。

    没错。它返回全局变量而没有变化。这个函数调用可能会被编译器完全优化掉。

    我相信val会被每个函数修改并单独存储。

    不正确,没有一个函数对值进行任何更改。

    此外,请查看故事讲述者对范围解析运算符 :: 概念的回答。

    【讨论】:

      【解决方案3】:

      您在全局级别将 val 声明为 20,因此 func2() 只会返回该值。

      在 func1() 中,您将 val 声明为 5,然后将其返回。全局变量在方法范围内被忽略。

      如果您对此感到困惑,我会阅读范围。

      【讨论】:

        【解决方案4】:

        func1 创建一个值为 5 的局部变量并返回它。全局变量保持不变。

        func2返回值为20的全局变量。

        【讨论】:

          【解决方案5】:

          func1 将 val 从 20 更改为 5

          不正确。

          func1 使用名为val 的局部变量,其值为5。它不会改变同名全局变量的值。

          func2 没有任何改变。

          正确。它只是返回全局变量val 的值。

          我相信val会被每个函数修改并单独存储。

          不正确。如发布的那样,这两个函数都不会修改全局变量val。全局值不会为每个函数单独存储。 func1 使用了同名的局部变量,根本不接触全局变量。 func2 访问全局变量的值但不修改它。

          【讨论】:

            【解决方案6】:

            让我告诉你一个故事,假设你住在一个小镇,即 SmallTown。你的邻镇是,你好。也有一个巧合,那就是你所居住的城市也叫你好。现在,你妈妈要你去你好去拿些面包。你的第一反应会是什么?你会去邻近的城镇,对吧。一周后你必须去另一个城市。现在,有人问你,“你什么时候回到你好?”。你现在在想哪个“你好”?城市,对。

            对于您的问题, 您要访问的 int 变量取决于您的范围。如果你在一个函数内部,即如果你的作用域是本地的并且有本地定义的同名和同类型的变量,它将在全局定义的变量之前被访问。

            两个变量不一样,内存地址也不一样,所以NO,

            func1 将 val 从 20 更改为 5

            这不是真的。两者都不同,就像城镇一样。

            当然,func2 不会改变任何事情,因为它会寻找 val 并到达全局定义的变量,就像它在城市外一样。

            同样,没有我相信 val 会被每个函数修改并单独存储。我想你现在知道答案了。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-08-09
              • 2021-07-29
              • 1970-01-01
              • 1970-01-01
              • 2020-03-26
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多