VS Pro 2022编译C++ Win32程序:变量重声明为何致计算结果恒为0?
问题分析:重声明变量导致计算结果始终为0
先看你贴的有问题的代码:
double dMetalFrameR = 0.0; if (m_dMetalDoorK) double dMetalFrameR = m_dMetalDoorX / m_dMetalDoorK;
为什么结果始终是0?
这是典型的**变量隐藏(variable shadowing)**问题:
- 你在
if语句块里用double重新声明了dMetalFrameR,这会创建一个仅在if块内部生效的局部变量,和外面那个初始化为0.0的变量完全是两个独立的内存实体。 - 当
m_dMetalDoorK不为0时,计算结果确实赋值给了这个内部的局部变量,但这个变量在if块执行完之后就立刻被销毁了,外面的那个dMetalFrameR自始至终都没被修改过,一直保持初始的0.0,所以你看到的结果自然是0。
为什么编译器没发出警告?
VS默认的警告等级(比如/W3)不会检测到变量隐藏的问题。你需要把警告等级调到**/W4**,或者单独启用C4456警告(专门针对变量被隐藏的情况),编译器才会提示你“局部变量隐藏了外部同名变量”这类信息。
修正后的代码去掉了double声明,直接赋值给外部的变量,自然能正确保留计算结果:
double dMetalFrameR = 0.0; if (m_dMetalDoorK) dMetalFrameR = m_dMetalDoorX / m_dMetalDoorK;
内容的提问来源于stack exchange,提问作者Thunderdonkey
相关产品推荐
相关产品推荐

