c ++中变量范围的机制

时间:2016-11-10 21:31:58

标签: c++

我对c ++中的范围有疑问。我的伙伴给了我一个练习测试,以帮助准备即将到来的技术考试,我不知道如何回答一个问题。

我收到了代码段

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

我需要重新审视范围的机制,因为我不确定以下哪个答案最好。

A)当代码超出范围时,编译器会记住将其值恢复为12。

B)当代码超出范围时,再次使用原始的nValue1。

我认为答案是B,是吗?

2 个答案:

答案 0 :(得分:4)

答案都不是。

没有"原始值",没有什么可记住的。

它们是两个独立的独立变量。在内部范围内,符号nValue1指的是一个变量。在内部范围之外,符号nValue1指的是不同的变量。

即使在内部范围内,也可以修改外部范围nValue1(通过指针或某种等效机制)。当内部范围存在时,nValue1不会被记住"具有与范围之前相同的值,但无论值是间接更新的,内部范围都有效。

答案 1 :(得分:0)

正如你对Sam Varshavchiks正确答案的补充,因为你的评论。所以,如果你的意思是,你在你的情况下备用一个变量,因为你重用了这个名字,事实并非如此。我将尝试为您说明,如何在内部范围(也称为"阴影")中重复使用变量名称的等效代码如下所示:

$setString='';

foreach($fields as $k=>$v){

$setString .=$k." = '".$v."', ";

}
$setString=rtrim($setString,', ');

如果你把它放入

$setString

并查看生成的汇编程序代码,您将看到两种情况下的相同输出:

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

您可以使用Compiler Explorer验证这一点:

您的代码使用int main() { // place the relevant code snipped here } Your code + assembler

我的等效使用 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 My code + assembler