表达式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;
}
}
答案 0 :(得分:3)
由于&&
运算符的short-circuiting属性,修改后的代码(您的“工作”版本,实际上不起作用)很可能通过访问-1来调用未定义的行为数组中的元素。
答案 1 :(得分:1)
评估a[-1]
是未定义的行为。由于逻辑AND运算符&&
具有短路语义,因此在原始代码中a[j - 1]
永远不会评估j == 0
。