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