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

C++中嵌套if与逻辑运算符&&的使用对比及短路求值疑问

关于C++中条件判断短路求值与数组越界的问题

你的疑问核心其实是C++逻辑与运算符&&的短路求值特性,这直接关系到两种写法的安全性,我来给你拆解清楚:

首先明确结论:第一种写法if (pieceisnotonedge && board[row+1][col] == 0)是完全安全的,不会出现索引越界问题。

为什么第一种写法安全?

C++中的&&是短路与:如果第一个条件pieceisnotonedge的结果是false,编译器会直接跳过后面的board[row+1][col] == 0判断,不会执行这部分代码。也就是说,只有当棋子确实不在边缘(pieceisnotonedge为true)时,才会去访问board[row+1][col],这就从根源上避免了索引越界的风险。

两种写法的对比

  • 第一种写法(合并条件):利用短路求值特性,代码更紧凑、可读性更强,完全等价于第二种嵌套if的逻辑,但写法更简洁。
  • 第二种写法(嵌套if):逻辑上和第一种完全一致,同样安全,但代码会稍显冗余,除非你需要在pieceisnotonedge为true时,先执行一些其他操作再判断board的状态,否则没必要嵌套。

结合你的国际象棋兵的场景举个实际例子

假设你的棋盘行索引是0到7(8行),黑兵('p')向下移动(行号+1),那么判断兵前进一格的合法走法可以这么写:

// 检查兵是否不在最后一行(避免row+1越界),且目标位置为空
if (row < 7 && board[row+1][col] == 0) {
    // 将(row+1, col)加入合法走法列表
}

// 初始位置的兵可以走两步的判断
if (row == 1 && board[row+1][col] == 0 && board[row+2][col] == 0) {
    // 将(row+2, col)加入合法走法列表
}

这里row < 7就是你的pieceisnotonedge,当row == 7时,第一个条件为false,后面的board[row+1][col]根本不会被访问,完美避免越界。

额外提醒

如果你不小心用了非短路的与运算符(比如C++中的&,位与),那才会出现两个条件都执行的情况,但我们写逻辑判断时几乎不会用位与来做条件组合,所以只要用&&就不用担心。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 19:47:54