#cpp
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? Чтение при выходе за границу массива.
Ответы
Ответ 1
Условие в 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, вычисляется правый операнд оператора. Так что в этом условие неопределенного поведения нет.
Комментариев нет:
Отправить комментарий