C++类bool成员函数新增复杂判定条件后无返回值问题咨询
问题原因及修复方案
核心问题根因
- 数组越界触发未定义行为:
修改后的内层循环条件改为了j < vect[i].size(),当j取vect[i].size()-2或vect[i].size()-1时,访问j+1、j+2会超出当前行的边界;同时纵向判定没有限制i的范围,当i取vect.size()-2或vect.size()-1时,访问i+1、i+2会超出二维数组的行边界。C++中数组越界属于未定义行为,会直接导致程序运行逻辑异常,你遇到的无打印输出、返回值错误都是典型的越界副作用。 - 必要代码行丢失:
修改后的代码删除了两行核心逻辑:一是bool controller=false;变量定义初始化语句,未初始化的局部变量取值完全随机,自然无法返回正确的布尔值;二是cout<<vect[0][0];打印语句,自然不会输出对应元素。 - break逻辑存在缺陷:
原有代码里的break只能跳出内层的j循环,外层的i循环还会继续执行,虽然不是致命错误,但会产生不必要的遍历开销。
修复后的完整control_vect函数
bool board :: control_vect(){ long unsigned int i,j; bool controller = false; cout << vect[0][0]; // 保留原打印逻辑,不需要可直接删除 // 横向走法判定:限制j最大为行长度-3,避免j+2越界 for (i = 0; i < vect.size(); i++){ for (j = 0; j < vect[i].size() - 2; j++){ if( (vect[i][j]==peg && vect[i][j+1]==peg && vect[i][j+2]==empty) || (vect[i][j]==empty && vect[i][j+1]==peg && vect[i][j+2]==peg) ){ return true; // 找到合法走法直接返回,无需继续遍历 } } } // 纵向走法判定:限制i最大为总行数-3,避免i+2越界 for (i = 0; i < vect.size() - 2; i++){ for (j = 0; j < vect[i].size(); j++){ if( (vect[i][j]==peg && vect[i+1][j]==peg && vect[i+2][j]==empty) || (vect[i][j]==empty && vect[i+1][j]==peg && vect[i+2][j]==peg) ){ return true; // 找到合法走法直接返回 } } } return false; // 遍历完全局未找到合法走法 }
修复后的代码会正确判定棋盘是否存在合法走法,存在则返回true输出a,否则返回false输出b,同时保留原有的vect[0][0]打印逻辑。
内容的提问来源于stack exchange,提问作者Vito Metvet
相关产品推荐
相关产品推荐

