【问题标题】:Ternary Operator in For Loop causing infinite iterationsFor循环中的三元运算符导致无限迭代
【发布时间】:2015-07-03 16:44:56
【问题描述】:

我正在研究一个转置NxN 矩阵的函数,该矩阵存储在floats 的数组中。我的第一个实现似乎导致函数无限循环,我似乎无法弄清楚为什么。这是原始代码:

for(int i = 0; i < numRows % 2 == 0 ? numRows / 2 : numRows / 2 + 1; i++)
{
    for(int j = i + 1; j < numColumns; j++)
    {
        //Swap [i,j]th element with [j,i]th element
    }
}

但是函数永远不会返回。未能在我的逻辑中看到错误,我改写了表达式,现在有以下工作代码:

int middleRow =  numRows % 2 == 0 ? numRows / 2 : numRows / 2 + 1;
for(int i = 0; i < middleRow; i++)
{
    for(int j = i + 1; j < numColumns; j++)
    {
        //Swap [i,j]th element with [j,i]th element
    }
}

谁能帮忙解释一下为什么第一个版本不起作用,而看似等效的第二个版本却可以?

【问题讨论】:

  • 不要表现得像个绝地武士,使用括号
  • 保留这个变量,你的代码看起来会更好,优化器会妥善处理它。
  • 我经常没有给优化器足够的信任。谢谢你的建议,我会的。
  • 是的,不需要这么复杂的结构。

标签: c for-loop infinite-loop ternary-operator operator-precedence


【解决方案1】:

根据operator precedence 表,&lt; 的优先级高于?:。您需要根据需要明确使用() 来强制执行所需的优先级。

改变

for(int i = 0; i < numRows % 2 == 0 ? numRows / 2 : numRows / 2 + 1; i++)

for(int i = 0; i < ( numRows % 2 == 0 ? numRows / 2 : numRows / 2 + 1) ; i++)

注意:请使用第二种方法。在可读性、维护和理解方面要好得多。

【讨论】:

  • 谢谢,我必须研究一下我的运算符优先级。这不是第一次让我陷入困境。将在 10 分钟内接受此答案。
【解决方案2】:

我认为运算符的优先级存在问题。 如果你想保持混乱的第一个版本(我不推荐)使用括号:

i < (numRows % 2 == 0 ? numRows / 2 : numRows / 2 + 1)

【讨论】:

    【解决方案3】:

    试试:

    i < ((numRows + 1) / 2)
    

    如果 numRows 为偶数,则为 numRows/2。如果为奇数,则为 numRows/2+1。

    这样会更快并避免由于比较而出现分支(除非您有一个知道这种模式的优秀编译器 - 不太可能。

    您有时必须退后一步才能看到全貌。

    【讨论】:

      猜你喜欢
      • 2017-05-02
      • 1970-01-01
      • 2018-11-08
      • 1970-01-01
      • 1970-01-01
      • 2017-08-21
      • 1970-01-01
      • 2022-01-04
      • 2021-07-18
      相关资源
      最近更新 更多