Что делает этот оператор C? - PullRequest
2 голосов
/ 23 ноября 2010

Ребята, мой профессор назначил нам задание, включающее набор текста с помощью массивов, указателей и функций. Теперь, прежде чем вы прыгнете мне на спину со всем, что «Мы не собираемся делать вашу домашнюю работу для вас», ответ на мой вопрос не решит проблему. На самом деле, я уже сделал свою лучшую догадку при ответе. Мне просто любопытно услышать, что вы думаете об этом.

Вот заявление C, которое мне дали:

double(*foo(double(*)(double,double[]),double))(double, ...);

Наша проблема заключалась в описании типа foo. Мой вопрос просто так: что на самом деле делает это утверждение? Насколько я могу прочитать, это либо одна из самых запутанных и нереалистичных строк кода, которые я когда-либо видел, либо это на самом деле недопустимо C. Дайте мне знать, что вы думаете.

Ответы [ 3 ]

10 голосов
/ 23 ноября 2010

То, что вы хотите выучить, это Правило спирали по часовой стрелке .Изучение этого поможет вам, в простых словах, описать, что представляет собой любой тип в Си.Выучи это хорошо.

0 голосов
/ 23 ноября 2010

Согласно моему компилятору (Visual Studio 2010) утверждение абсолютно ничего не делает .Он успешно компилируется, но для него не сгенерированы инструкции по сборке, поэтому отладчик переходит прямо к нему.Что касается , почему ничего не делает и что это действительно означает - потребуется кто-то с большим знанием C, чем я, чтобы объяснить это.

Я могу выяснить тип foo, используяПравило по часовой стрелке / спираль, хотя - спасибо, Джер !Проще немного переформатировать:

double
(
    *foo
    (
        double(*)(double, double[]),
        double
    )
)
(double, ...);
0 голосов
/ 23 ноября 2010

Это немного поможет

typedef RETURNTYPE (* POINTER_TO_FUNCTION_TYPE)(ARGTYPE1, ARGTYPE2)

C поддерживает тип, который является указателем на функцию, и вы можете набрать один таким образом, чтобы упростить более длинные выражения на его основе.

ТакС помощью этого typedef я мог бы объявить эту функцию

POINTER_TO_FUNCTION_TYPE f(POINTER_TO_FUNCTION_TYPE g);

Это функция, которая принимает указатель на функцию и возвращает указатель на функцию.Без typedef представьте, как будет выглядеть это объявление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...