2013-11-24 2 views
1

Выражение 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

«Предоставление того же выхода» - это не то же самое, что «правильная программа», к сожалению. –

ответ

1

Это неопределенное поведение оценить a[-1]. Поскольку логический-И-оператор && имеет короткозамкнутую семантику, a[j - 1] никогда не оценивается, если j == 0 в исходном коде.

+0

Не обязательно неопределенное поведение для оценки 'a [-1]', так как 'a' может указывать на элемент, отличный от 1-го массива. –

+0

@BenjaminLindley Это абсолютно верно, но поскольку это функция сортировки, * очень вероятно * иметь UB. –

+0

@BenjaminLindley: Я должен был сказать «это * вообще * UB» ... meh, вы должны выбрать свои битвы. –

3

Потому что из-за свойства short-circuiting оператора && измененный код (ваша «рабочая» версия, которая на самом деле не работает) скорее всего вызовет неопределенное поведение, обратившись к элементу -1 в массиве.

Смежные вопросы