c++中变量作用域的机制
mechanics of variable scope in c++
我有一个关于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
:我的代码+汇编器
相关文章:
- 未在作用域中声明unordered_map
- 有没有一种方法可以在编译时获得作用域类名
- C++quit()函数中可能存在作用域问题
- 未在此作用域OpenCV3.4中声明cvSaveImage
- 全局作用域中函数指针的赋值
- 在类函数中初始化外部作用域变量
- 不同作用域中的静态变量和全局变量
- 是同一作用域的函数部分中的函数调用
- 未在此作用域中声明的函数和变量 (C++)
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 将作用域枚举转换为基础类型
- 表达式必须具有完整或无作用域的枚举图
- 在构造函数中输入对象时C++类成员作用域
- 无法让"std::enable_if"适用于无作用域枚举
- 为什么不能直接引用作用域枚举类成员,而不能为无作用域枚举生成类成员?
- 函数未在作用域中声明 / 如何结合使用 header.h、header.cpp 和 main.cpp?
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- 如何在C++中访问作用域的变量输出?
- 重载时未在 C++ 的作用域错误中声明
- c++中变量作用域的机制