【问题标题】:the scope and priority of variable in c++c++中变量的范围和优先级
【发布时间】:2020-05-11 12:33:20
【问题描述】:

谁能向我解释为什么结果是 2,x 使用的是哪个以及为什么。

auto x = 0;

int f(int i){
    auto x = 1;
    {
        static auto x = 0;
        x += i;
    }
    return x;
}
int main() {
    cout << f(1) + f(2) <<endl;// result 2
    return 0;
}

【问题讨论】:

  • 您需要确定这是 C 还是 C++,因为它们在 auto 的情况下非常不同。 cout 在 C 中不起作用,所以我将删除 C 标记。
  • 我下次注意谢谢

标签: c++ scope declaration


【解决方案1】:

内部x 遮蔽了外部,但突变只适用于最内部的范围

int f(int i){
    auto x = 1;              // consider this "x1"
    {
        static auto x = 0;   // this is "x2"
        x += i;              // mutates "x2" but not "x1"
    }
    return x;                // return "x1" which is still 1
}

因此

f(1) + f(2)                  // 1 + 1 == 2

【讨论】:

  • 在函数外声明了另一个auto x=1;
  • @idclev463035818 但它不相关,它从未使用过
  • @Jabberwocky 我知道,但 OP 不知道
  • s/but/so/ ... ?
【解决方案2】:

这都是关于变量阴影

函数f 中最里面的x 隐藏了该函数中的自动x。所以这个函数相当于

int f(int){
    auto x = 1;
    return x;
}

另外请注意,我的精简版中的x 阴影是全局范围内的。

函数f进一步缩写为

int f(int){
    return 1;
}

现在程序输出应该很明显了。

【讨论】:

    【解决方案3】:

    其实这个函数

    int f(int i){
        auto x = 1;
        {
            static auto x = 0;
            x += i;
        }
        return x;
    }
    

    可以像这样重写

    int f(int i){
        auto x = 1;
        return x;
    }
    

    因为在这个块作用域中声明了静态变量x

    {
        static auto x = 0;
        x += i;
    }
    

    不在块外使用,不影响函数的返回值。此代码块的唯一副作用是具有未定义行为的静态有符号整数变量x 可能溢出。

    所以这两个函数调用f(1)f(2) 返回1,结果表达式f(1) + f(2) 产生2

    在程序中声明了三个变量x。全局命名空间中的第一个

    auto x = 0;
    

    函数f 最外层的第二个块隐藏了全局命名空间中变量x 的声明。

    auto x = 1;
    

    第三个是在函数 f 的内部块中声明的

    {
        static auto x = 0;
        x += i;
    }
    

    在这个内部块之外是不可见的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-02
      • 2018-03-07
      • 1970-01-01
      • 2012-02-24
      • 1970-01-01
      • 2020-12-20
      • 1970-01-01
      相关资源
      最近更新 更多