У меня есть короткая программа, с которой я собираюсь протестировать «бесконечную рекурсию». Тем не менее, я встречаю еще один сложный вопрос, связанный с указателем на функцию ...Тип указателя функции
программа выглядит следующим образом:
#include <stdio.h>
int repeat(char (*func)(int, int), int a) {
func(a, a+1);
return repeat(func, a+1);
}
char f (int a , int b){
printf("%d\n", a);
//return (double)(a + b);
return 'c';
}
int main(int argc, char const *argv[])
{
repeat(&f, 1);
return 0;
}
Что касается меня, я думаю, что «F» в «повтора (& F, 1)»имеет тип„полукокса *“и 'FUNC' в„Int повторе (полукокса (* FUNC) (INT, INT), внутр а)“имеет тип„полукокса *“ ,слишком.
Однако, это кажется странным. Если я изменил «(char (* func) (int, int), int a)« to »(char func (int, int), int a)», компилятор (тестирование в gcc и vc6) не давайте никаких предупреждений, и результат выполнения тот же.
Если я изменю «(CHAR (* Func) (Int, Int), внутр а)» к «(двойной FUNC (целое, целое), внутр а)», компилятор бросает:
предупреждение: несовместимые типы указателей прохождения 'символ () (INT, INT)' для параметра типа 'двойной () (Int, Int)' [-Wincompatible-указатель типов] повторения (& F, 1);
Кажется, что компилятор лечить «дважды (целое, целое)» и «двойной (*) (целое, целое)» тот же самый материал. Другими словами, если я меняю «(char (* func) (int, int), int a)« to »double (* func) (int, int)», компилятор выдает одно и то же сообщение (Я тестировал):
предупреждение: типы несовместимыми указатель прохождения 'символ () (INT, INT)' для параметра типа 'двойных () (Int, Int)' [-Wincompatible-указатель типов ] repeat (& f, 1);
God ... Ну, это еще не конец. После этого я меняю «повтор (& f, 1)« «повторить (f, 1)» с другими частями без изменений. То есть, вся программа:
#include <stdio.h>
int repeat(char (*func)(int, int), int a) {
func(a, a+1);
return repeat(func, a+1);
}
char f (int a , int b){
printf("%d\n", a);
//return (double)(a + b);
return 'c';
}
int main(int argc, char const *argv[])
{
repeat(f, 1);
return 0;
}
компилятор не дают каких-либо предупреждений и результаты погонных одинаковы.
Таким образом, я смущен тем, что весь следующий париз не дает никаких предупреждений и правильных результатов.
1 repeat(&f, 1) int repeat(char (*func)(int, int), int a)
2 repeat(&f, 1) int repeat(char func(int, int), int a)
3 repeat(f, 1) int repeat(char (*func)(int, int), int a)
4 repeat(f, 1) int repeat(char func(int, int), int a)
Конечно, 'е' в «повтора (F, 1)» имеет тип «полукокса (Int, Int)», и 'Func' в "Int повторе (double (func) (int, int), int a) "имеет тип" char () (int, int) ".
Вы можете сделать вывод, изменив «Int повтор (символ (* FUNC) (целое, INT), внутр а)» к «INT повтора (двойной (* FUNC) (целое, целое), Int А)»и проверьте предупреждение:
предупреждение: несовместимые типы указателей проходящего 'символа (Int, Int)' для параметра типа 'двойного () (Int, Int)' [-Wincompatible-указатель типов ] repeat (f, 1); *
Кто может комментировать? Я полностью считаю, что только первый из четырех правилен относительно типа.
В этом коде отсутствует 'char *'. 'char (*) (int, int)' является указателем на функцию, возвращающую 'char' и принимающую два аргумента' int'. Также, http://cdecl.org. –
Возможный дубликат [Синтаксис указателя функции C] (http://stackoverflow.com/questions/14114749/c-function-pointer-syntax) –
Обратите внимание, что система типов C не может объявить невариантную функцию, которая принимает себя как параметр функции. –