Страницы

Поиск по вопросам

воскресенье, 30 июня 2019 г.

Сортировка слиянием и ub

void merge(const int* a1, const int* a2, int* buffer, const int& l1, const int& l2) { int a(0), b(0);
while(a + b < l1 + l2) { if(b >= l2 || a < l1 && a1[a] <= a2[b]) { buffer[a + b] = a1[a]; ++a; } else { buffer[a + b] = a2[b]; ++b; } } }
Вот это логическое выражение b >= l2 || a < l1 && a1[a] < a2[b], разве не будет ub? тк выполняется && при a не вышедшем за длину массива и при b вышедшем - обращение к a2[b], при неком стечении обстоятельств, это не будет ub? Чтение при выходе за границу массива.


Ответ

Условие в jf предложении можно записать как
if ( ( b >= l2 ) || ( a < l1 && a1[a] < a2[b] ) )
Согласно Стандарту С (6.5.14 Logical OR operator)
4 Unlike the bitwise | operator, the || operator guarantees left-to-right evaluation; if the second operand is evaluated, there is a sequence point between the evaluations of the first and second operands. If the first operand compares unequal to 0, the second operand is not evaluated
Поэтому сначала вычисляется левый операнд оператора ||, и только в случае, если результат вычисления равен 0, вычисляется правый операнд оператора.
Так что в этом условие неопределенного поведения нет.

Комментариев нет:

Отправить комментарий