Этот фрагмент кода представляет собой просто поиск количества цифр, необходимых для «самого длинного» целого числа; это, вероятно, необходимо для выделения некоторого буфера позже.
log10
дает силу десять, что соответствует его аргументу, который, округленному до следующего целого числа (отсюда +1
с последующим (int)
гипсом, что приводит к усечению), дает количество цифр, необходимые для числа ,
Аргумент log10
- это немного беспорядок, поскольку abs
вызывается дважды, когда только один раз будет достаточно. Тем не менее, идея состоит в том, чтобы перейти к log10
абсолютное значение проверяемого числа, если оно не равно нулю, или 1, если оно равно нулю, - потому что, если аргумент был равен нулю, логарифм расходится до минус бесконечности (что нежелательно в этом случае я думаю, что преобразование в int
приведет к странным результатам).
Остальная часть цикла - это просто поиск максимума: на каждой итерации он вычисляет цифры, необходимые для текущего текущего объекта, проверяет, больше ли он «текущего максимума» (d
), и если это , он заменяет «текущий максимум».
d+=1
может быть предостерегающим (?) Или для нуль-терминатора выделенной строки, это зависит от того, как используется d
.
Что касается «неоднозначного вызова» ошибка: вы получите это, потому что вы звоните log10
с int
аргументом, который может быть преобразован в равной степени float
, double
и long double
(все типы, для которых log10
перегружен), поэтому перегрузка выбирать не понятно компилятору. Просто приклейте бросок (double)
перед целым аргументом log10
.
Кстати, этот код может быть упрощен/оптимизировано путем просто ищем максимальный int
(по абсолютной величине) и затем принимая по основанию 10 логарифма, чтобы обнаружить количество цифр, необходимых.
место остального кода? эта часть только находит максимальную цифру из всех номеров. – james