в чем разница между вызовом функции как fun() и fun?
Я наткнулся на кусок кода, который выглядит следующим образом
qsort(array, 10, sizeof(int), sort);
Здесь сортировка снова является функцией. Но у меня всегда было впечатление, что любая вызываемая функция должна иметь ()
после имени функции или я что-то упустил.
4 ответа:
qsort(array, 10, sizeof(int), sort);
При этом передается указатель на функцию "sort", чтобы функция" qsort " могла вызвать эту функцию.
Эта функция не вызывается, она передается как указатель на функцию. См. указатели функций в языках C и C++
Вы передаете указатель на функцию
sort
функцииqsort
, так чтоqsort
может использовать функцию в качестве функции сравнения.Правильный синтаксис должен включать в себя
&
передsort
(так какsort
является функцией, а не указателем, поэтому нам нужно ссылаться на него), но компилятор "добавляет" его для вас в любом случае.
Если вы посмотрите на грамматику C (например, в стандарте C), вы обнаружите, что существует оператор, записанный как
()
, который является оператором вызова функции . Он аналогичен оператору подстрочного индекса массива[]
в том, что он применяется к идентификатору, в данном случае к имени функции. Если за идентификатором функции не следует оператор вызова функции, то идентификатор представляет собой указатель на эту функцию. Итак, теперь становится ясно, какойqsort
Последний arg is: указатель на функцию сравнения. Всякий раз, когда ему нужно сравнить два элемента, он вызывает функцию, на которую указывает его последний arg.Функция
sort
в вашем примере называется функциейобратного вызова ,qsort
вызывает ее обратно (несколько раз, с разными аргументами).