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

Ternary Operator in For Loop causing infinite iterations

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

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
    }
}

但是函数从来没有 returns。在我的逻辑中没有看到错误,我改写了表达式,现在有以下工作代码:

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
    }
}

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

根据 operator precedence table,<?: 具有更高的优先级。您需要根据需要明确使用 () 来强制执行所需的优先级。

改变

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++)

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

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

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

尝试:

i < ((numRows + 1) / 2)

如果 numRows 是偶数,它将只是 numRows/2。如果是奇数,它将是 numRows/2+1.

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

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