Если вы попытаетесь напечатать значение sqrt(n)
, как если бы было целым числом:
printf("sqrt(n) = %d\n", sqrt(n)); // Don't do this
, то у вас неопределенное поведение.sqrt()
возвращает результат типа double
.Компилятор не знает (или не обязан знать) ожидаемый тип аргумента.Вы должны передать аргумент правильного типа.Вышеупомянутый вызов printf
имеет неопределенное поведение.
В других контекстах, где тип и ожидаемый тип выражения однозначны, язык требует неявных преобразований.В частности, в выражении i <= sqrt(n)
, где i
и n
имеют тип int
, аргумент n
преобразуется из int
в double
(тип параметра для sqrt()
) , and the value of
я is also converted from
Int to
double`.Результат, вероятно, будет тем, что вы ожидали.
Кстати, это:
for (int i = 3; i <= sqrt(n); i = i+2) ...
, скорее всего, будет неэффективным.Функция sqrt
является относительно дорогой, и она будет вызываться на каждой итерации цикла.(Предварительный расчет sqrt(n)
в некоторых случаях является хорошим решением, но здесь значение n
может изменяться в цикле.)
Альтернатива:
for (int i = 3; i*i <= n; i += 2) ...
, которая позволяет избежатьСложности арифметики с плавающей точкой (но подумайте о том, может ли i*i
переполниться).
(Было бы хорошо, если бы в C была целочисленная функция квадратного корня в стандартной библиотеке, но это не так.)