Review fix

This commit is contained in:
Microvenator
2025-09-25 23:02:24 +03:00
committed by Nekrolm
parent 6b082049de
commit 61266dec35
+1 -1
View File
@@ -31,7 +31,7 @@ int main() {
В этом коде нет неопределенного поведение (по крайней мере на используемых входных данных). Но есть неявное приведение типов, делающее результат неожиданным.
1. Тип возвращаемого значения `std::accumulate` определяется третьим аргументом. В данном случае это целочисленный знаковый ноль — тип по умолчанию для всех числовых литералов.
2. Тип значения, возвращаемого оператором деления, определяется по правилам для [типичных арифметических преобразований](https://timsong-cpp.github.io/cppwp/n4950/expr.arith.conv) (usual arithmetic conversions). В этих правилах участвует понятие [ранга преобразования](https://timsong-cpp.github.io/cppwp/n4950/conv.rank) (conversion rank). Он определен для любого целочисленного типа. Ранг `size_t` выше, чем `int`, поэтому он будет выбран в качестве типа результата деления.
2. Тип возвращаемого значения операции деления определяется наибольшим из участвующих типов аргументов, а также правилами для [типичных арифметических преобразований](https://timsong-cpp.github.io/cppwp/n4950/expr.arith.conv) (usual arithmetic conversions). В примере тип левого аргумента — `int`, а правого — `size_t`. Это достаточно широкое беззнаковое целое, более широкое, чем `int`. Поэтому он будет выбран в качестве типа результата деления.
3. `-3` неявно преобразуется к типу `size_t` — такое преобразование вполне определено. Результатом будет беззнаковое число `2^N - 3`. Здесь `N` — количество бит, отводимых под тип `size_t`.
4. Далее будет произведено деление беззнаковых чисел. `(2^N - 3) / 3`. Старший бит результата окажется нулевым.
5. Возвращаемым типом функции `average` объявлен `int`. Так что нужно выполнить еще одно неявное преобразование.