C++小作用域重声明同名变量后得到垃圾值的原因是什么?
C++代码输出异常原因
你遇到的是C++变量作用域遮蔽+声明生效时机共同导致的问题,具体逻辑如下:
- 首先明确C++的变量声明规则:当你在某个作用域声明一个变量时,变量名会在声明符书写完成、初始化语句执行前就进入当前作用域,直接遮蔽外层作用域的同名变量。
你的代码里内层块的int tar = tar;语句,当解析完int tar这部分之后,内层的tar变量名已经生效,外层初始化为0的tar已经被遮蔽了。所以等号右侧的tar指代的是刚声明、还未做任何初始化的内层tar本身。 - 未初始化的局部变量存储在栈内存中,默认保留内存里的残留脏数据。你用未初始化的变量值给自己赋值,属于C++标准明确规定的未定义行为,输出的814005873就是栈内存里的随机脏值,每次运行结果都可能发生变化。
如果要实现用外层tar的值初始化内层变量,只要避免重名遮蔽即可,示例正确写法:
int tar = 0; { int inner_tar = tar; cout << inner_tar; }
此时输出就是预期的0。
内容的提问来源于stack exchange,提问作者HelloWorld
相关产品推荐
相关产品推荐

