我对c ++中的范围有疑问。我的伙伴给了我一个练习测试,以帮助准备即将到来的技术考试,我不知道如何回答一个问题。
我收到了代码段
int nValue1 = 12, nTotal =0;
nTotal += nValue1;
{
int nValue1 = 14;
nTotal += nValue1;
}
nTotal += nValue1;
我需要重新审视范围的机制,因为我不确定以下哪个答案最好。
A)当代码超出范围时,编译器会记住将其值恢复为12。
B)当代码超出范围时,再次使用原始的nValue1。
我认为答案是B,是吗?
答案 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