c++中变量作用域的机制

mechanics of variable scope in c++

本文关键字:机制 作用域 变量 c++      更新时间:2023-10-16

我有一个关于c++作用域的问题。我的朋友给了我一个练习测试,以帮助我准备即将到来的技术考试,我不知道如何回答一个问题。

我得到代码片段

int nValue1 = 12, nTotal =0;
nTotal += nValue1;
{
    int nValue1 = 14;
    nTotal += nValue1;
}
nTotal += nValue1;

我需要复习一下作用域的机制,因为我不确定下面哪个答案是最好的。

A)当代码超出作用域时,编译器记得将其值恢复为12。

B)当代码超出作用域时,再次使用原来的nValue1。

我认为答案是B,对吗?

答案都不是。

没有"原始值",也没有什么需要记住的。

它们是两个独立的变量。在内部作用域中,符号nValue1指代一个变量。在内部作用域之外,符号nValue1引用了一个不同的变量。

即使在内部作用域中,外部作用域的nValue1也可以被修改(通过指针或一些等效的机制)。当内部作用域存在时,nValue1不会被"记住"具有与作用域之前相同的值,而是在内部作用域有效时间接更新的任何值。

作为Sam Varshavchiks正确答案的一个补充,因为你对它的评论。所以如果你的意思是,在你的情况下,你省去了一个变量,因为你重用了这个名字,那就不是这样了。我将尝试为您说明,在内部作用域(也称为"阴影")中不重用变量名的等效代码是如何的:

int nValue1 = 12, nTotal =0;
nTotal += nValue1;
{
    int nValue2 = 14;
    nTotal += nValue2;
}
nTotal += nValue1;
如果你把它放到
int main() {
 // place the relevant code snipped here
}
并查看生成的汇编代码,您将看到两种情况下相同的输出:
    push    rbp
    mov     rbp, rsp
    mov     DWORD PTR [rbp-4], 12
    mov     DWORD PTR [rbp-8], 0
    mov     eax, DWORD PTR [rbp-4]
    add     DWORD PTR [rbp-8], eax
    mov     DWORD PTR [rbp-12], 14
    mov     eax, DWORD PTR [rbp-12]
    add     DWORD PTR [rbp-8], eax
    mov     eax, DWORD PTR [rbp-4]
    add     DWORD PTR [rbp-8], eax
    mov     eax, 0
    pop     rbp
    ret

你可以在编译器资源管理器中验证:

你的代码使用nValue1:你的代码+汇编器

我的等效使用nValue2:我的代码+汇编器