C++ 变量阴影是否适用于C++;?

C++ 变量阴影是否适用于C++;?,c++,C++,我在Leetcode.com上运行了这段代码,但它会打印随机数。然而,它在我的本地机器上工作。有人知道变量阴影是否应该在所有编译器中都起作用吗 int carry = 0; if (1) { int carry = carry + 1; cout << carry << endl; } int进位=0; 如果(1){ 整数进位=进位+1; CUT< P>阴影是由C++标准定义的,必须在所有符合编译器的情况下工作。

我在Leetcode.com上运行了这段代码,但它会打印随机数。然而,它在我的本地机器上工作。有人知道变量阴影是否应该在所有编译器中都起作用吗

    int carry = 0;
    if (1) {
        int carry = carry + 1;
        cout << carry << endl;
    }
int进位=0;
如果(1){
整数进位=进位+1;

CUT< P>阴影是由C++标准定义的,必须在所有符合编译器的情况下工作。
您的代码打印垃圾,因为
carry+1
中的
carry
读取的是新变量(此时尚未初始化,导致UB),而不是旧变量。

如@HolyBlackCat所述:


阴影是由C++标准定义的,必须对所有的对象进行工作。 一致性编译器

因此,由于
carry
内部
carry+1
采用新的
carry
,并且
carry
未初始化,任何事情都可能发生,因为这是未定义的行为(UB)

请注意,UB并不意味着输出是随机的,它只是意味着任何东西都可以打印出来(因此它可能是一致的),在某些情况下,您将得到正确的答案

编辑:

对于“如果内部进位还没有定义,为什么不读旧的进位?”

它是在编译器中以这种方式设计的,正如@Nikita Demoov所提到的:

(出于某种原因)一旦到达变量的标识符,就会声明变量。这就是为什么
=
后面的
进位
是新声明的
进位
,而不是
如果
之外携带

如前所述:

通过显式声明全局作用域,可以隐藏具有全局作用域的名称 块作用域中的名称。但是,可以使用 作用域解析运算符(


换句话说,每当定义的局部变量与全局变量的名称相同时,编译器都会优先考虑该局部变量。

是的,范围规则是语言的一部分。我在Leetcode.com上运行了此代码,但它会打印随机数。但是,它在我的本地计算机上工作。有人知道变量阴影是否为s吗是否允许跨所有编译器工作?由于
进位
未初始化,因此结果是未定义的行为,这意味着任何事情都可能发生。编译器可以帮助您做到这一点:如果使用适当的标志编译示例,您会发现
int carry=0;
未使用(
-Wunused variable
),并且
int carry=carry+1;
未初始化(
-Wuninitialized
)。这两条信息可能有助于您自己识别问题。哦,那就有道理了。为什么不读取较旧的“carry”呢如果内部进位尚未定义?@starckoverfar变量名可见的点与初始化完成时不同。很难说为什么会这样做。您可以在自己的初始值设定项中对变量执行一些有用的操作,例如获取其地址(即使在那时也是合法的)并将其传递到某个地方。@starckoverfar•如果内部进位尚未定义,为什么不读取较旧的“进位”?内部进位已定义,只是未初始化。注意:出于一个非常聪明和深思熟虑的原因(我不知道,但如果你知道,请告诉我),一个变量一旦到达其标识符就会被声明。这就是为什么
=
之后的
进位
是新声明的
进位
,而不是
之外的
进位
,如果
@nikitademov感谢澄清者,我会编辑答案。顺便说一句,我也不知道原因…@nikitademov您可能需要有链接的节点结构,其中节点可能指向自身。在这种情况下,在初始化过程中引用变量可能会很有用:
node node{.next=&node}
@eerorika啊,谢谢你!现在我觉得自己没有想到这一点很愚蠢…:)尽管令人印象深刻的是,C语言的创建者当时已经想到了大多数这样的事情。这真的让你感激设计语言的工作量!