当条件为真时,为什么x的值没有变化?

时间:2018-07-26 18:37:21

标签: c++

int x = 1;
if (x > 0)
    int x = 2;
cout << x;

我希望输出将为2,因为条件为真,但是这里会发生什么?

我收到了1作为输出。

2 个答案:

答案 0 :(得分:10)

您已经shadowed变量。 当在一个范围内声明的变量与在外部范围内声明的变量具有相同的名称时,就会发生这种情况。

进行此修改将提供您期望的输出:

int x = 1;
if (x > 0) {
  x = 2; // now you're modifying the same x
}
cout << x;

答案 1 :(得分:4)

在c ++变量或其他符号声明中,它们对于它们的作用域而言是局部的,在另一个作用域中重新声明它们称为shadowing,您将看不到当前scope级别之外的赋值影响。这很重要

  • 局部作用域(括号{}中的所有内容,或紧随ifelsecasewhile之类的控制流语句之后出现的所有内容for
    典型示例:

    int i = 5;
    if(i == 5)
        int i = 2; // Single statement scope following the if
                   // Changes the local variable's value
    

    int j = 42;
    if(j == 42) {
        int j = 2; // Scoped block local variable
                   // Changes the local variable's value
    }
    
  • 类范围(任何类成员变量)
    典型示例:

    class MyClass {
        int myMember_;
    public:
        MyClass(int aValue) {
            int myMember_; // another local variable in the constructor function
            myMember_ = aValue; // Changes the local variable's value
        }
    };
    

    class MyClass {
        int myMember_;
    public:
        MyClass(int aValue) {
            int myMember_ = aValue; // Changes the local variable's value
        }
    };
    
  • 命名空间范围(任何命名空间全局变量)。
    与上述相同的原理。命名空间可以隐藏其他命名空间中的变量(符号)


您的c ++编译器可能会警告您上述情况之一的出现。
使用专门的GCC(g ++),您可以使用-Wshadow编译器标志来强制执行该操作。