为何该C++程序输出"Hello World"?print函数存在未定义行为吗?
C++同名变量赋值导致输出异常的原因解析
问题场景
主函数传入i=1调用print函数,print函数的for循环内定义了与参数同名的变量i并赋值为int i = i,最终却输出了"Hello World",该现象是否由未定义行为导致?
结论
是的,这个现象完全是由print函数中的未定义行为引发的。
具体解释
- 在C++的作用域规则中,当你在for循环的初始化语句里声明
int i时,这个局部i会立即覆盖外层(函数参数)的同名变量i。所以赋值语句int i = i里,等号右侧的i指向的是刚声明的这个局部变量——而它此时是未初始化的。 - 根据C++标准,读取未初始化变量的值属于未定义行为:程序的结果没有任何保证,可能出现任何情况。在你的测试中,未初始化的
i恰好被分配到了一个小于1的垃圾值,导致循环条件i<1成立,进而执行了循环体输出内容。
修正示例
只要避免局部变量覆盖外层参数,就能得到符合预期的行为,比如将循环内的变量改名:
#include <iostream> void print(int i) { // 使用不同变量名,避免覆盖参数 for (int j = i; j<1; j++) { std::cout << "Hello World" << "\n"; } } int main() { int i = 1; std::cout << "i = " << i << "\n"; print(i); return 0; }
此时循环初始化的j会正确使用参数i的值1,j<1不成立,循环体不会执行,也就不会输出"Hello World"。
内容的提问来源于stack exchange,提问作者Fractal
相关产品推荐
相关产品推荐

