【问题标题】:Ternary operator precedence and assignment三元运算符优先级和赋值
【发布时间】: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


【解决方案1】:

是的,它们是等价的。 = 最后出现。

【讨论】:

    猜你喜欢
    • 2018-08-14
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    • 2010-12-19
    相关资源
    最近更新 更多