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);
4 Réponses :
Ignorer la valeur de retour d'une fonction est parfaitement valide. Prenez ceci par exemple: nous ignorons la valeur de retour de 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 . P> De même, si vous faites ceci: p> Vous avez une expression dont la valeur est rejetée (c.-à-d. La valeur de une affectation est également une expression: p> 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 A>. P> Il n'y a rien d'indéfini à ignorer la valeur d'une expression. p> p> printf code> 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. P> i code > Avant d'être incrémenté), cependant, l'opérateur ++ code> incrémente toujours la variable. p> j = k code>, dont la valeur est la valeur de k code> (qui a été simplement affectée à j code>). Cette valeur est ensuite utilisée comme côté droit une autre affectation à i code>. La valeur du i = (j = k) code> expression est supprimée. P>
Pour que cela explicite, vous pouvez également utiliser (void) rejeté code>.
Il compile car appeler une fonction et ignorer le résultat de retour est très em> commun. En fait, la dernière ligne de la principale le fait aussi. est en réalité court pour: p> ... et vous n'utilisez pas la valeur renvoyée à partir de l'opérateur final 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 ( < << / code>. P> __ __ (((warn_unused_result)) code>) - mais cela ne fonctionne que si le type de retour n'a pas de destructeur: - (. / p> p>
La raison courte qu'il est autorisée est que c'est ce que la norme spécifie.
La déclaration p> rejette la valeur renvoyée par La principale raison est que la plupart des expressions ont à la fois un effet et produisent un résultat. Donc p> définir causera à la fois Si vous souhaitez supprimer explicitement le résultat d'un appel de fonction, il est possible. faire p> et une instruction comme p> ne compilera pas, généralement due à une inadéquation de types (un < code> int code> ne peut pas être attribué la valeur de quelque chose de type 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). P> p> Change_i () Code>. P> i code> doit être 8 code>, mais l'expression d'affectation elle-même a également le résultat de 8 code>. C'est pourquoi (si j code> est de type int code>) p> j code > et i code> pour avoir la valeur de 8 code>. Ce type de logique peut continuer indéfiniment - c'est pourquoi les expressions peuvent être chaînées, telles que k = i = j = 10 code>. 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. P> vide code>). p>
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 );
Dupliqué possible de G ++ Comment obtenir un avertissement sur l'ignorance retour Valeur
Étant donné qu'une affectation (
= code>) 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 code> pour modifier son paramètre; Il faudrait prendre une entréeint & code> en entrée, pasint code>.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 ++"!