【发布时间】:2015-08-24 21:43:06
【问题描述】:
我的代码中有一个不寻常的错误,有时我的代码会返回错误的值。我在一个可能是罪魁祸首的函数中有一个三元表达式,它是这样写的;
corpusBoard[i][j] = (piece == 'o') ? 'o' : 'x';
应该说明,如果piece等于'o',则将'o'分配给corpusBoard[i][j],否则将'x'分配给corpusBoard[i][j]。
下面这两个语句是等价的吗?如果不是,为什么?
corpusBoard[i][j] = (piece == 'o') ? 'o' : 'x';
corpusBoard[i][j] = ((piece == 'o') ? 'o' : 'x');
编辑:
我遇到的特殊问题是我正在处理的一个项目,系统会检查各种数据库中的匹配项,然后将玩家片段实例化为数据库中的角色。由于这些片段可以是“o”或“x”,因此我想要一种简单的方法来在数据库中进行模式匹配时“翻转”它们:
std::vector<std::vector<char>> Machine::matchCorpus(std::vector<std::vector<char>> corpusBoard)
{
for(int i = 0; i < corpusBoard.size(); i++){
for(int j = 0; j < corpusBoard[0].size(); j++){
if(corpusBoard[i][j] == 'M'){
corpusBoard[i][j] = ((piece == 'o') ? 'x' : 'o');
}
if(corpusBoard[i][j] == 'H'){
corpusBoard[i][j] = ((piece == 'o') ? 'o' : 'x');
}
}
}
return corpusBoard;
}
不幸的是,在极少数情况下,它会返回错误的值,即使是 'o' 和 corpusBoard[i][j] == 'H',它也应该始终将 corpusBoard[i][j] 分配给 'o',但很少会分配给 'x ' 代替。
【问题讨论】:
-
@donjuedo:这是一个字符。
-
从字面上看,您的问题只是关于等效性。但是您的错误听起来很有趣。是否愿意将您的项目简化为最小示例?
-
@donjuedo:我会将完整的功能粘贴到我的问题中,但它是我正在使用马尔可夫链进行的一个更大项目的一部分,因此错误可能在其他地方。
-
您是否在最后一次分配之前和之后进行了条件打印以确认?其他地方是否有线程,所以一块可能会改变?
-
@donjuedo:是的,我就是这么做的。它正在其他地方发生。我的一个值在输入到我的数据库之前没有被转换,并且被存储为“x”,这就是我偶尔会得到错误结果的原因。至少我现在知道问题出在哪里。感谢您帮助我排除此功能。
标签: c++ c++11 ternary-operator