91 votes

Les parenthèses autour du résultat sont-elles significatives dans une instruction return?

Y a-t-il une différence entre ces deux déclarations à l'intérieur d'une fonction ?

bool returnValue = true;
// Code qui fait quelque chose
return(returnValue);

et ceci ?

bool returnValue = true;
// Code
return returnValue;

Le premier a des parenthèses autour de returnValue.

0 votes

Merci Rob, tu as capturé avec succès l'esprit de la question. En Essence je me demandais si le compilateur faisait quelque chose de spécial (comme essayer d'évaluer l'expression d'abord) ou s'il l'ignorait simplement.

1 votes

Il est difficile de répondre à cette question pour tout c++ / c. Ce serait bien d'être plus précis sur la définition du langage, mais je ne sais pas comment corriger cela 9 ans plus tard.

0 votes

Pour C il y a un doublon stackoverflow.com/questions/161879/…

150voto

Michael Petch Points 24066

À partir de C++14, il y a une différence.

C++14 ajoute un cas particulier où les parenthèses autour d'une valeur de retour peuvent altérer la sémantique. Cet extrait de code montre deux fonctions étant déclarées. La seule différence réside dans les parenthèses autour de la valeur de retour.

int var1 = 42;
decltype(auto) func1() { return var1; } // le type de retour est int, identique à decltype(var1)
decltype(auto) func1() { return(var1); } // le type de retour est int&, identique à decltype((var1))

Dans le premier func1 retourne un int et dans le second func1 retourne un int&. La différence de sémantique est directement liée aux parenthèses environnantes.

Le spécificateur auto sous sa forme la plus récente a été introduit en C++11. Dans le specification du langage C++, il est décrit comme suit :

Spécifie que le type de la variable qui est déclarée sera automatiquement déduit de son initialisateur. Pour les fonctions, spécifie que le type de retour est un type de retour en suffixe ou sera déduit à partir de ses instructions de retour (depuis C++14)

Ainsi, C++11 a introduit le spécificateur decltype qui est décrit dans la specification du langage C++ :

Inspecte le type déclaré d'une entité ou interroge le type de retour d'une expression.

[snip]

  1. Si l'argument est soit le nom non parenthésé d'un objet/fonction, ou est une expression d'accès à un membre (objet.membre ou pointeur->membre), alors le decltype spécifie le type déclaré de l'entité spécifiée par cette expression.

  2. Si l'argument est toute autre expression de type T, alors

a) si la catégorie de valeur de l'expression est xvalue, alors le decltype spécifie T&&

b) si la catégorie de valeur de l'expression est lvalue, alors le decltype spécifie T&

c) sinon, decltype spécifie T

[snip]

Notez que si le nom d'un objet est parenthésé, il devient une expression lvalue, donc decltype(arg) et decltype((arg)) sont souvent des types différents.

En C++14, la capacité d'utiliser decltype(auto) a été autorisée pour les types de retour des fonctions. Les exemples originaux sont là où la différence sémantique avec les parenthèses entre en jeu. Revisitant les exemples originaux :

int var1 = 42;
decltype(auto) func1() { return var1; } // le type de retour est int, identique à decltype(var1)
decltype(auto) func1() { return(var1); } // le type de retour est int&, identique à decltype((var1))

decltype(auto) permet au type de retour en fin de fonction d'être déduit de l'entité/expression sur l'instruction de retour. Dans la première version return var1; est effectivement identique à retourner le type decltype(var1) (un type de retour int selon la règle 1 ci-dessus) et dans le deuxième cas return (var1); c'est effectivement identique à decltype((var1)) (un type de retour int & selon la règle 2b).

Les parenthèses font que le type de retour est int& au lieu de int, donc un changement de sémantique. Morale de l'histoire - "Toutes les parenthèses dans un type de retour ne sont pas équivalentes"

6voto

Karl Rosaen Points 2096

Il n'y a pas de différence.

Une raison d'utiliser des parenthèses serait si vous vouliez évaluer une expression avant de retourner mais dans votre exemple, il n'y aurait pas de raison. Voir :

Parenthèses entourant les valeurs de retour

pour plus de discussion.

3 votes

Bien que même avec une expression compliquée, ces parenthèses ne provoquent toujours pas un comportement différent. Ils rendent simplement le sens plus évident (subjectivement !) pour les lecteurs humains.

0 votes

@Karl "Une raison d'utiliser des parenthèses serait si vous vouliez évaluer une expression avant de la retourner." Pouvez-vous donner un exemple de cela ?

3 votes

@ChrisMiddleton Non, car l'affirmation est tout aussi absurde ici que dans ce fil de discussion. Il n'y a absolument aucune différence fonctionnelle entre return m * x + c et return (m * x + c) ou return ( (m * x) + c ) ou etc. - et cela ne semble pas non plus plus intuitif ou attrayant, si vous me le demandez.

4voto

James Points 3829

Les parenthèses sur l'exemple supérieur sont superflues; elles sont effectivement ignorées.

Ce serait la même chose que quelque chose comme...

int x = (5);

Les parenthèses ici sont également ignorées.

0 votes

Eh bien, techniquement, ils ne sont pas ignorés, ils n'ont simplement aucun effet sur la valeur de l'expression.

1 votes

@John: ignoré efficacement. :)

3 votes

+1 ... c'est la seule réponse qui indique que les parenthèses sont en fait redondantes et montre que leur utilisation est un peu stupide.

4voto

Davidann Points 3405

D'après ce que je sais, rien n'est différent.

En C++, les expressions peuvent prendre la forme : expr ou (expr). Donc, ce dernier est une expression avec plus de frappe. Pour plus d'informations à ce sujet, consultez une grammaire (cherchez "expression").

0 votes

David, merci pour le lien. J'ai la grammaire dans le livre C++ de Stroustrup, mais (par paresse je suppose) je ne le regarde pas tant que ça, maintenant que je l'ai mis en signet dans mon navigateur je peux m'y référer plus souvent.

3voto

aschepler Points 23731

Je suppose que boo est une faute de frappe, et vous demandez s'il y a une différence entre

return expr;

et

return(expr);

La réponse est non.

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