You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中负数循环变量与vector.size()比较导致for循环不运行问题

问题原因
  1. 有符号数与无符号数隐式转换问题
    C++ 中std::vector::size()返回的是无符号整数类型size_type,当你把有符号 int 类型的row=-1和无符号的board.size()比较时,编译器会自动把row隐式转换为无符号类型,-1 转换为无符号数后是对应类型的最大值,远大于你此处的网格大小5,因此循环条件row < board.size()直接不成立,外层循环一次都不会执行。
    你将row改为long unsigned int类型后,给无符号变量赋值-1本质还是得到无符号数的最大值,循环条件依旧不成立。
  2. 原代码存在内存越界风险
    就算循环能正常进入,当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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 18:27:05