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
相关产品推荐
相关产品推荐

