这两个条件有什么区别?

时间:2013-11-24 22:55:35

标签: c++

表达式j > 0 && a[j - 1] > value_to_insert出现在sort_ints函数的定义中。为什么将其重写为a[j-1] > value_to_insert && j > 0是不可接受的?我尝试以相反的方式放置条件,它给了我与原始相同的输出。

这是功能定义:

void sort_ints(int *a, int n)
{
    int i;
    int j;
    int value_to_insert;

    for (i = 1; i < n; i++) {
        value_to_insert = a[i];

        /* Shift values greater than value_to_insert. */
        j = i;
        while (j > 0 && a[j - 1] > value_to_insert) {
            a[j] = a[j - 1];
            j--;
        }
        a[j] = value_to_insert;
    }
}

2 个答案:

答案 0 :(得分:3)

由于&&运算符的short-circuiting属性,修改后的代码(您的“工作”版本,实际上不起作用)很可能通过访问-1来调用未定义的行为数组中的元素。

答案 1 :(得分:1)

评估a[-1]是未定义的行为。由于逻辑AND运算符&&具有短路语义,因此在原始代码中a[j - 1]永远不会评估j == 0