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

