C++如何在if-else语句中正确更新全局变量
C++分支内更新变量的正确实现
代码存在的核心问题
当前写法里,你在if、else的独立代码块中,使用double theta_radian的语法重新声明了和外层同名的变量,这在C++中属于变量名遮蔽规则覆盖的场景:
- 代码块内声明的变量,仅在当前大括号包裹的作用域内有效,块执行结束就会被系统回收销毁
- 块内的赋值操作只会修改这个块内新建的临时变量,完全不会影响外层提前定义、最终要打印的那个
theta_radian - 这就是为什么你最后打印的
theta_radian永远是初始化的0值,无法拿到分支内计算出的角度结果
不管你要更新的变量是全局作用域的,还是当前函数内部作用域的,核心逻辑完全一致:只要不重新声明同名的遮蔽变量,直接对目标变量赋值即可,没有特殊的语法差异。
修正后的代码
只需要把分支内重新声明变量的double类型关键字删掉,直接给外层已经存在的theta_radian赋值即可:
double theta_radian{}; if (l2 >= l1) { theta_radian = atan2(e2.y(), e2.x()); std::cout << "theta_local" << theta_radian << std::endl; } else { theta_radian = atan2(e1.y(), e1.x()); } std::cout << "theta_radian" << theta_radian << std::endl;
更简洁的等价写法
因为这个场景本质是根据一个条件二选一给同一个变量赋值,完全可以用C++的三目条件表达式精简逻辑,省去多行if-else结构:
double theta_radian = (l2 >= l1) ? atan2(e2.y(), e2.x()) : atan2(e1.y(), e1.x());
内容的提问来源于stack exchange,提问作者Tyr
相关产品推荐
相关产品推荐

