Pregunta & operador opcional en asignación de puntero a función


En el siguiente código:

/* 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;
}

En la linea

logfunc = &mylog10;

Me he dado cuenta de que el unario & (dirección de) operador es opcional, y el programa se compila y ejecuta de la misma manera con o sin él (en Linux con GCC 4.2.4). ¿Por qué? ¿Es esto un problema específico del compilador, o quizás dos estándares de lenguaje diferentes aceptados por el compilador? Gracias.


8
2017-11-28 19:42


origen


Respuestas:


Operador & es de hecho opcional cuando toma la dirección de una función en su contexto (asignándola a algo). No es específico del compilador, se sigue de la definición formal del lenguaje.

Simétricamente, operador * es opcional cuando se invoca la función a través de un puntero. En su ejemplo, podría invocar la función como (*logfunc)(n) o logfunc(n). Usaste el último, pero el primero también funcionaría.


13
2017-11-28 19:56



Tienes razón de que & es opcional. Las funciones, como las matrices, se pueden convertir automáticamente en punteros. No es específico del compilador ni es el resultado de diferentes estándares de lenguaje. Del estándar, Sección 6.3.2.1, párrafo 4:

UN designador de funciones es una expresión que tiene tipo de función. Excepto cuando es el operando de sizeof operador o el unario & operador, un designador de función con el tipo "función de retorno tipo"se convierte en una expresión que tiene un tipo" puntero para devolver la función tipo".


14
2017-11-28 19:45



Respondiendo en C ++. Para C, lo mismo vale


7
2017-11-28 19:49



Del estándar (6.3.2.1/4):

UN designador de funciones es una expresion   que tiene un tipo de función. Excepto cuando   es el operando del tamaño de   operador o unario y operador, un   designador de función con tipo   '' Función que devuelve tipo '' es   convertido a una expresión que tiene   escriba '' puntero a la función que regresa   tipo''.

Entonces sí, omitiendo el & produce un puntero para funcionar de todos modos.


5
2017-11-28 19:52