For循环中的三元运算符导致无限迭代

Posted

技术标签:

【中文标题】For循环中的三元运算符导致无限迭代【英文标题】:Ternary Operator in For Loop causing infinite iterations 【发布时间】: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
    

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

【问题讨论】:

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

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

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

【讨论】:

以上是关于For循环中的三元运算符导致无限迭代的主要内容,如果未能解决你的问题,请参考以下文章

190329迭代器-生成器-三元运算-列表解析

Python推导式

循环条件中的三元运算符:评估顺序/操作。优先级不明确

Python 使用带有 for 循环的三元运算符

在“for”循环条件中使用“三元运算”是一种好习惯吗?

JavaScript if判断三元运算符循环