web-dev-qa-db-fra.com

Parenthèses entourant les valeurs de retour

Très souvent, dans le code ANSI C, je peux voir des parenthèses entourant une seule valeur de retour.

Comme ça:-

int foo(int x) {
  if (x)
    return (-1);
  else
    return (0);
}

Pourquoi utiliser () autour de la valeur de retour dans ces cas? Des idées? Je ne vois aucune raison à cela.

67
Tooony

Il n'y a vraiment aucune raison ... c'est juste une vieille convention.

Pour économiser de l'espace, les programmeurs feraient souvent le calcul final dans la ligne de retour au lieu de sur sa propre ligne et les parens s'assurent qu'ils sont principalement là pour faire en sorte qu'il soit plus facile de voir que c'est une seule instruction qui est retournée, comme ceci:

return (x+i*2);

au lieu de

int y = x+i*2;
return y;

La parenthèse est devenue une habitude et elle est restée.

56
Adam Haile

Un motif pratique, mais peu probable, est que si vous mettez des parenthèses autour de la valeur, vous pouvez définir return comme une macro, puis insérer du code de journalisation pour surveiller tous vos retours.

47
user10392

Mon style personnel est d'utiliser des parenthèses s'il y a une expression complexe; par exemple.,

return (a + b);

mais de ne pas les utiliser si l'expression est un terme simple

return a;

Je ne peux pas dire pourquoi je le fais de cette façon; juste quelque chose que j'ai ramassé il y a longtemps.

Au fait, je pense que le faire ressembler à un appel de fonction, comme ceci:

return(a);  // ugh

est incroyablement laid et tout simplement faux.

23

Dans la spécification C d'origine, des parenthèses étaient requises autour de la valeur de retour. Bien que les compilateurs C modernes et la norme C ANSI ne les exigent pas, la présence de parenthèses n'affecte pas la valeur de retour, et les programmeurs parfois encore les inclure par habitude, peu familiers avec les normes, par souci de cohérence avec une convention stylistique qui les requiert, ou éventuellement par compatibilité descendante.

Je devrais ajouter, pour les personnes qui pensent au C++: Cette question concerne C et C n'est pas C++; ce sont deux langages différents avec des normes, des capacités, des niveaux de difficulté et des styles d'utilisation différents qui émergent - quoi qu'ils aient en commun, il est sage de les traiter comme deux choses totalement distinctes. Pour une question similaire qui couvre C++, voir Les parenthèses autour du résultat sont-elles significatives dans une déclaration de retour? .

14
rakslice

Il y a quelques raisons:

  1. si/tandis que/pour/etc. sont tous des mots clés de contrôle qui doivent avoir des parenthèses. Il semble donc souvent naturel de toujours les renvoyer.

  2. sizeof est le seul autre mot-clé qui peut les avoir ou non, sauf que dans certains cas, vous devez utiliser des parens. Il est donc plus facile de prendre l'habitude de toujours utiliser des parens. pour sizeof, ce qui implique une logique de: si vous le pouvez, faites toujours.

  3. case/goto sont les seuls mots-clés où vous n'utilisez jamais de parens. ... et les gens ont tendance à les considérer comme des cas spéciaux (et, comme eux, à se démarquer des autres mots clés de contrôle, en particulier goto).

13
James Antill

En retournant -1 comme dans votre exemple, je pense que c'est plus lisible avec la parenthèse car le moins est plus visible:

return 1

ou

return -1

ou

return (-1)
8

C'est peut-être personnalisé - après tout, les gens qui nous ont apporté Unix et C venaient du projet Multics. Multics a été écrit en PL/I, et en PL/I les parenthèses sont obligatoires.

4
James Jones

J'ai travaillé avec au moins un programmeur qui pensait retourner était une sorte spéciale d'appel de fonction, et a été surpris quand il a vu que mon code était conforme sans les parens.

2
AShelly

Comme c'est souvent le cas lors de l'utilisation de parenthèses, je pense que c'est juste pour la lisibilité (par exemple, Ruby prend en charge les appels de méthode sans parenthèses entourant les arguments, mais les livres et articles récents conseillent le contraire).

2
Manrico Corazzi