7
votes

Ne devons-nous pas avoir à affecter des valeurs de retour des fonctions aux variables? C / C ++

J'utilise C / C ++ pendant environ trois ans et je ne peux pas croire que je n'ai jamais rencontré ce problème avant!

Ce code suivant compile (je viens d'essayer d'utiliser GCC): P >

i = change_i(10);


8 commentaires

Dupliqué possible de G ++ Comment obtenir un avertissement sur l'ignorance retour Valeur


Étant donné qu'une affectation ( = ) est une expression, émettant un avertissement pour chaque expression inutilisée serait problématique.


Voir nodiscard Attribut en C ++ 17


Quelles options utilisez-vous pour compiler? Utilisez-vous -wall? Il y a d'autres drapeaux à GCC qui allument / désactivent les avertissements.


De côté: souvent, on s'attendrait à une fonction appelée Change_i pour modifier son paramètre; Il faudrait prendre une entrée int & en entrée, pas int .


Vous devrez vérifier vos paramètres de compilateur et vous assurer d'avoir un avertissement pour les valeurs supprimées.


Void Change_i (int & I) est ce que vous voulez faire. Comme mentionné ci-dessus.


Ne spamez pas les étiquettes. Il n'y a pas de langage "C / C ++"!


4 Réponses :


2
votes

Ignorer la valeur de retour d'une fonction est parfaitement valide. Prenez ceci par exemple: xxx

nous ignorons la valeur de retour de printf ici, qui renvoie le nombre de caractères imprimés. Dans la plupart des cas, vous ne vous souciez pas du nombre de caractères imprimés. Si les compilateurs avertis à ce sujet, le code de chacun afficherait des tonnes d'avertissements.

Ceci en fait un cas particulier d'ignorer la valeur d'une expression, où la valeur de l'expression est la valeur de retour d'une fonction .

De même, si vous faites ceci: xxx

Vous avez une expression dont la valeur est rejetée (c.-à-d. La valeur de i Avant d'être incrémenté), cependant, l'opérateur ++ incrémente toujours la variable.

une affectation est également une expression: xxx < P> Ici, vous avez deux expressions d'affectation. One est j = k , dont la valeur est la valeur de k (qui a été simplement affectée à j ). Cette valeur est ensuite utilisée comme côté droit une autre affectation à i . La valeur du i = (j = k) expression est supprimée.

Ceci est très différent de ne pas renvoyer une valeur d'une fonction non annulée. Dans ce cas, la valeur renvoyée par la fonction est indéfinie et tenter d'utiliser cette valeur de cette valeur dans comportement non défini .

Il n'y a rien d'indéfini à ignorer la valeur d'une expression.


1 commentaires

Pour que cela explicite, vous pouvez également utiliser (void) rejeté .



6
votes

Il compile car appeler une fonction et ignorer le résultat de retour est très commun. En fait, la dernière ligne de la principale le fait aussi. xxx

est en réalité court pour: xxx

... et vous n'utilisez pas la valeur renvoyée à partir de l'opérateur final < << / code>.

Certains dames statiques ont des options à avertir lorsque les retours de fonction sont ignorés (puis des options pour annoter une fonction dont les retours sont souvent ignorés). GCC a une option pour marquer une fonction comme nécessitant la valeur de retour ( __ __ (((warn_unused_result)) ) - mais cela ne fonctionne que si le type de retour n'a pas de destructeur: - (. / p>


0 commentaires

2
votes

La raison courte qu'il est autorisée est que c'est ce que la norme spécifie.

La déclaration xxx

rejette la valeur renvoyée par Change_i () .

La principale raison est que la plupart des expressions ont à la fois un effet et produisent un résultat. Donc xxx

définir i doit être 8 , mais l'expression d'affectation elle-même a également le résultat de 8 . C'est pourquoi (si j est de type int ) xxx

causera à la fois j et i pour avoir la valeur de 8 . Ce type de logique peut continuer indéfiniment - c'est pourquoi les expressions peuvent être chaînées, telles que k = i = j = 10 . Donc, à partir d'une perspective linguistique - il n'a pas de sens d'exiger qu'une valeur renvoyée par une fonction soit attribuée à une variable.

Si vous souhaitez supprimer explicitement le résultat d'un appel de fonction, il est possible. faire xxx

et une instruction comme xxx

ne compilera pas, généralement due à une inadéquation de types (un < code> int ne peut pas être attribué la valeur de quelque chose de type vide ).

Tout ce qui dit, plusieurs compilateurs (et analyseurs de code statiques) peuvent être configurés pour Donnez un avertissement si l'appelant n'utilise pas de valeur renvoyée par une fonction. De tels avertissements sont désactivés par défaut - il est donc nécessaire de compiler avec les paramètres appropriés (options de ligne de commande par exemple).


0 commentaires

1
votes

J'utilise C / C ++ pour environ trois ans strong> p>

Je peux supposer que pendant ces trois années, vous avez utilisé la fonction C standard C printf code>. Par exemple P>

destination = strcpy( destination, source );


0 commentaires