For循环中的三元运算符导致无限迭代
Posted
技术标签:
【中文标题】For循环中的三元运算符导致无限迭代【英文标题】:Ternary Operator in For Loop causing infinite iterations 【发布时间】:2015-07-03 16:44:56 【问题描述】:我正在研究一个转置NxN
矩阵的函数,该矩阵存储在float
s 的数组中。我的第一个实现似乎导致函数无限循环,我似乎无法弄清楚为什么。这是原始代码:
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
谁能帮忙解释一下为什么第一个版本不起作用,而看似等效的第二个版本却可以?
【问题讨论】:
不要表现得像个绝地武士,使用括号 保留这个变量,你的代码看起来会更好,优化器会妥善处理它。 我经常没有给优化器足够的信任。谢谢你的建议,我会的。 是的,不需要这么复杂的结构。 【参考方案1】:根据operator precedence 表,<
的优先级高于?:
。您需要根据需要明确使用()
来强制执行所需的优先级。
改变
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。
这样会更快并避免由于比较而出现分支(除非您有一个知道这种模式的优秀编译器 - 不太可能。
您有时必须退后一步才能看到全貌。
【讨论】:
以上是关于For循环中的三元运算符导致无限迭代的主要内容,如果未能解决你的问题,请参考以下文章