为何C++中连续==判断三个字符串相等失效?JS习惯引发问题
问题原因
在C++中,==运算符是左结合的,这意味着TICTACTOE[0][0] == TICTACTOE[0][1] == TICTACTOE[0][2]会被拆解成两步计算:
- 先执行
TICTACTOE[0][0] == TICTACTOE[0][1],得到一个bool类型的结果(true对应整数1,false对应整数0)。 - 再用这个布尔值和
TICTACTOE[0][2]做相等比较。由于你的数组是string类型,C++会把布尔值隐式转换为字符串(true转成"1",false转成"0"),再和数组中的元素(比如"X"、"O")对比,结果自然不符合预期。
你习惯的JavaScript写法其实也存在逻辑误区——JS的==同样是左结合,a == b == c也是先算a==b得到布尔值,再和c比较。如果觉得JS里这样写能正常工作,大概率是混淆了连续相等和逻辑与的写法,实际JS中正确判断三个值相等也需要写成a == b && b == c(或严格相等a === b && b === c)。
解决方法
直接用逻辑与连接判断
这是最直观高效的写法,明确判断前两个元素相等,同时后两个元素也相等:
bool trial = TICTACTOE[0][0] == TICTACTOE[0][1] && TICTACTOE[0][1] == TICTACTOE[0][2];
封装辅助函数(复用场景)
如果需要多次判断三个元素相等,可以封装通用函数提升代码可读性:
#include <string> bool allThreeEqual(const std::string& a, const std::string& b, const std::string& c) { return a == b && b == c; } // 调用示例 bool trial = allThreeEqual(TICTACTOE[0][0], TICTACTOE[0][1], TICTACTOE[0][2]);
循环判断(适配更长行)
如果后续要处理n×n的井字棋,用循环会更灵活:
bool rowIsEqual = true; const std::string& first = TICTACTOE[0][0]; for (int col = 1; col < 3; ++col) { if (TICTACTOE[0][col] != first) { rowIsEqual = false; break; } }
内容的提问来源于stack exchange,提问作者Myth Vince
相关产品推荐
相关产品推荐

