mirror of
https://github.com/Nekrolm/ubbook.git
synced 2026-06-09 13:14:18 +03:00
Review fix
This commit is contained in:
@@ -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`. Так что нужно выполнить еще одно неявное преобразование.
|
||||
|
||||
Reference in New Issue
Block a user