为何C++代码中声明cin输入后却能无限输入?已排查无死循环
问题原因分析及修复
你的代码存在两个核心问题,直接导致程序出现看似“无限输入”的异常行为:
1. 变量赋值完全颠倒,mx/mn未初始化
你在判断a和b大小的逻辑里,把赋值方向完全搞反了:
原代码中:
if(b >= a) { b = mx; // 错误:将未初始化的mx赋值给b a = mn; // 错误:将未初始化的mn赋值给a } if(a > b) { a = mx; // 错误:赋值逻辑颠倒,且使用未初始化变量 b = mn; }
mx和mn是刚声明的局部变量,未被赋值时内存中是随机垃圾值。你本该把较大值赋给mx、较小值赋给mn,结果反而用未初始化的mx/mn覆盖了输入的a/b,导致后续mn和mx的取值完全随机。
2. 基于未初始化变量的循环导致死循环
后续的for(int i = mn; i <= mx; i++)依赖mn和mx的随机值:
- 如果
mn远大于mx,循环条件一开始就不满足,程序直接无输出退出; - 如果
mn远小于mx,或mx是极大正数,循环会执行极多次数,看起来像“无限运行”; - 更极端的情况是,随机值会让循环边界形成永远满足的条件,直接进入死循环。
另外,两次大小判断逻辑重复,可合并优化。
修复后的代码
#include <iostream> using namespace std; int main() { long long a,b,c; cin >> a >> b >> c; long long mx,mn; // 正确赋值:将较大值给mx,较小值给mn if(b >= a) { mx = b; mn = a; } else { mx = a; mn = b; } int x; int r = c; for(int i = mn; i <= mx; i++) { x = i; if(x - mn == mx - x) { for(int j = 0; j < x; j++) { c += (long long)r * r; // 强制类型转换避免int溢出 } cout << c + (mx - mn); return 0; } } // 添加默认输出,避免无结果退出 cout << "No middle element found"; return 0; }
额外说明:修复中添加了(long long)r * r的强制类型转换,防止r为较大int值时,r*r先以int计算导致溢出;同时添加了循环结束后的默认输出,避免当mn到mx之间无中间值时程序无输出直接退出。
内容的提问来源于stack exchange,提问作者Saad Alarifi
相关产品推荐
相关产品推荐

