C++中负数循环变量与vector.size()比较导致for循环不运行问题
问题原因
- 有符号数与无符号数隐式转换问题
C++ 中std::vector::size()返回的是无符号整数类型size_type,当你把有符号 int 类型的row=-1和无符号的board.size()比较时,编译器会自动把row隐式转换为无符号类型,-1 转换为无符号数后是对应类型的最大值,远大于你此处的网格大小5,因此循环条件row < board.size()直接不成立,外层循环一次都不会执行。
你将row改为long unsigned int类型后,给无符号变量赋值-1本质还是得到无符号数的最大值,循环条件依旧不成立。 - 原代码存在内存越界风险
就算循环能正常进入,当row=-1时,内层循环执行board[row].size()相当于访问board[-1],属于数组越界访问,会触发未定义行为,大概率直接导致程序崩溃。
解决方法
推荐拆分逻辑,单独打印表头,避免使用负索引值,逻辑更清晰也不会触发类型转换问题,修改后的代码如下:
#include <iostream> #include <vector> using namespace std; void print_board(const vector<vector<char>>& board) { // 先打印表头列号 cout << " "; for (int col = 0; col < board[0].size(); col++) { cout << col << " "; } cout << endl; // 逐行打印行号和网格内容 for (int row = 0; row < board.size(); row++) { cout << row << " "; for (int col = 0; col < board[row].size(); col++) { cout << board[row][col] << " "; } cout << endl; } } int main() { int max_rows = 5; vector<vector<char>> player_one_board(max_rows, vector<char>(max_rows, '-')); print_board(player_one_board); return 0; }
如果要保留原写法,需要同时处理类型转换和越界问题:比较时显式把board.size()转为 int 类型,row=-1时不要访问board[row],直接用board[0].size()取列数即可,示例如下:
void print_board(vector<vector<char>> board) { int row, col; int board_size = static_cast<int>(board.size()); for (row = -1; row < board_size; row++) { if (row > -1) cout << row << " "; else cout << " "; // 表头第一行开头的空格 int col_count = static_cast<int>(board[0].size()); for (col = 0; col < col_count; col++) { if (row == -1) cout << col << " "; else cout << board[row][col] << " "; } cout << endl; } }
内容的提问来源于stack exchange,提问作者kimetsu no yaiba
相关产品推荐
相关产品推荐

