31 votes

Associativité de l'opérateur d'appel de fonction en C

J'allais à travers le thème de l'associativité des opérateurs de C.

Là, je suis tombé sur ce fait que l'appel de la fonction d'opérateur de () a une gauche à droite associativité. Mais l'associativité ne vient que pour jouer lorsque plusieurs opérateurs de même priorité se produire dans une expression. Mais je ne pouvais pas trouver un exemple impliquant appel de fonction de l'opérateur où l'associativité joue un rôle crucial.

Par exemple, dans l'énoncé a = f(x) + g(x);, le résultat dépend de l'ordre d'évaluation et non pas sur l'associativité de la deux appels de fonction. De même, l'appel f(g(x)) permettra d'évaluer la fonction g() d'abord, puis la fonction f(). Ici, nous avons une fonction imbriquée appel et, de nouveau, l'associativité n'est pas de jouer un rôle.

Les autres opérateurs de C dans ce groupe de priorité sont l'indice de tableau [], postfix ++ et postfix --. Mais je ne pouvais pas trouver des exemples impliquant une combinaison de ces opérateurs avec des () où l'associativité joue un rôle dans l'évaluation de l'expression.

Donc ma question est: l'associativité de l'appel de fonction étant définie comme la gauche vers la droite affecter n'importe quelle expression de C? Quelqu'un peut-il donner un exemple où l'associativité de l'opérateur d'appel de fonction () a de l'importance dans l'évaluation de l'expression?

44voto

Grzegorz Szpetkowski Points 10225

Voici un exemple où l’associativité gauche-droite de l’opérateur d’appel de fonction est importante:

 #include <stdio.h>

void foo(void)
{
    puts("foo");
}

void (*bar(void))(void) // bar is a function that returns a pointer to a function
{
    puts("bar");
    return foo;
}

int main(void)
{
    bar()();

    return 0;
}
 

L'appel de fonction:

 bar()();
 

est équivalent à:

 (bar())();
 

15voto

ace Points 1754

Outre la réponse de @ GrzegorzSzpetkowski, vous pouvez également disposer des éléments suivants:

 void foo(void) { }

int main(void) {
    void (*p[1])(void);
    p[0] = foo;
    p[0]();
    return 0;
}
 

Cela crée un tableau de pointeurs de fonction, vous pouvez donc utiliser l'opérateur d'indice de tableau avec l'opérateur d'appel de fonction.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X