& оператор, необязательный в назначении указателя функции

В следующем коде:

/* mylog.c */
#include <stdio.h>
#include <stdlib.h> /* for atoi(3) */

int mylog10(int n)
{
    int log = 0;
    while (n > 0)
    {
        log++;
        n /= 10;
    }
    return log;
}

int mylog2(int n)
{
    int log = 0;
    while (n > 0)
    {
        log++;
        n >>= 1;
    }
    return log;
}

int main(int argc, const char* argv[])
{
    int (*logfunc)(int); /* function pointer */
    int n = 0, log;

    if (argc > 1)
    {
        n = atoi(argv[1]);
    }

    logfunc = &mylog10; /* is unary '&' operator needed? */

    log = logfunc(n);
    printf("%d\n", log);
    return 0;
}

в строке

logfunc = &mylog10;

Я заметил, что унарный оператор & (адрес) является необязательным, и программа компилируется и работает одинаково как с ним, так и без него (в Linux с GCC 4.2.4). Зачем? Это проблема конкретного компилятора или, возможно, компилятор принимает два разных языковых стандарта? Спасибо.

8
задан pr1268 28 November 2010 в 19:42
поделиться