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

C++中逻辑或运算符的顺序为何会引发数组越界问题?

为什么调整DFS判断条件顺序会导致数组越界?

原DFS递归函数的判断条件运行完全正常:

void dfs(vector<vector<int>> &grid, int i, int j, int& sum) 
{
    if(i < 0 || j < 0 || i >= grid.size() || j >= grid[i].size() || grid[i][j] == 0)
    {
        return;
    }
    sum++;
    grid[i][j] = 0;
    
    dfs(grid, i+1, j, sum);
    dfs(grid, i-1, j, sum);
    dfs(grid, i, j+1, sum);
    dfs(grid, i, j-1, sum);
}

但将判断条件调整为如下形式后,程序出现数组越界错误:

if(i < 0 || j < 0 || j >= grid[i].size() || i >= grid.size() || grid[i][j] == 0)
{
    return;
}

问题原因

你提到逻辑或(||)是左到右短路求值,这点没错,但顺序调整后,非法访问的时机提前了:

  • 原代码中,先判断i >= grid.size(),如果i已经超出二维数组的行范围(比如i == grid.size()),这个条件为真,会直接触发返回,不会执行后面的j >= grid[i].size()。
  • 修改后的代码中,j >= grid[i].size()放在了i >= grid.size()前面。当i超出行范围时,grid[i]会访问vector的越界下标(vector的有效下标是0到size()-1),这时候还没来得及判断i是否越界,就已经触发了数组越界错误。

简单说:必须先确保i是合法的行下标,才能安全访问grid[i]获取列数,顺序颠倒就会在i非法时提前访问grid[i],导致越界。

内容的提问来源于stack exchange,提问作者Provenence Matdodger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 09:34:50