Just Curious Y a-t-il une limitation technique pour avoir plusieurs valeurs de retour pour des méthodes dans des langues telles que Java, C, C ++ ou limitation est juste par spec? Dans la langue d'assemblage, je comprends que Callee peut sauter une valeur à enregistrer. p>
10 Réponses :
C'est juste une décision prise par les concepteurs de langue et / ou d'abi. Ni plus ni moins. En langage d'assemblage, vous pouvez faire ces décisions vous-même, cependant, je ne suis pas sûr de ce que signifie votre dernier commentaire. P>
Sa conception, car il n'est pas nécessaire d'autoriser plusieurs valeurs dans la déclaration de retour. Vous pouvez toujours définir une structure avec tous les membres nécessaires et créer une instance de la structure et le renvoyer. Simple!
Exemple, P>
struct Person { std::string Name; int Age; std::string Qualification; //... }; Person GetInfo() { Person person; //fill person's members ... return person; }
@Billy: merci. Je l'ai mentionné dans ma réponse maintenant.
Oui, mais vous avez toujours une fonction qui retourne une valeur unique, même si cette valeur unique se trouve être une structure.
Parce que de bonnes langues de programmation encouragent les programmeurs à faire la bonne chose. Si une méthode doit renvoyer plusieurs valeurs, ces valeurs sont probablement liées et devraient donc être un groupe ensemble dans quelque chose comme une structure. P>
juste mes 2 cents. p>
Ni C ni C ++ ne sont conçus pour "encourager les programmeurs à faire la bonne chose"
En outre, C ++ renvoie une paire code> à partir de certaines fonctions de la bibliothèque standard, notamment Carte :: Insérez code>. Cela ne les regrouper pas de quelque manière que ce soit, ce n'est que le seul hack le plus facile disponible pour atteindre un objectif qui serait décrit de manière plus proprement, "renvoyer deux valeurs". Donc, si C ++ tente de nous dire de générer des choses de manière significative, elle n'a pas défini d'exemple idéal.
MDR. Je n'ai jamais dit c ou C ++ étaient bonne i> Langues de programmation. Cependant bon i> est un terme relatif.
C et C ++ étaient deux des langues de la question. Et pour le compte rendu, je suis en désaccord avec votre affirmation que le langage de programmation est responsable d'encourager les programmeurs à faire la bonne chose - un idiot est un idiot, quelle que soit la ou les langues de programmation qu'il travaille.
struct code>, référence (en java / c #) ou le pointeur. li>
- Parce que vous pouvez utiliser un paramètre OUT. LI>
ol>
Permettre à plusieurs valeurs de retour ajouterait une complexité et il est simplement fonctionné. Il n'y a aucune raison d'être là. (En effet, en C ++, vous pouvez renvoyer un tuple code> (à partir de TR1, C ++ 11 ou de boost) qui correspond effectivement à plusieurs valeurs de retour) p>
"Il y a / était un registre unique" - sur ces terrains, nous devrions nous compter chanceux, nous pouvons retourner un long code> par valeur ;-)
@Steve: Je ne pense pas long long code> existé dans "Ye Olden Days" de C. (une structure est certainement plus grande qu'un registre et je pense que vous pouvez les renvoyer à C89, bien que vous ne puissiez pas en k & r)
J'ai changé mon commentaire depuis long long code> à
long code>. J'étais ditée parce que d'une part, comme vous dites
long long code> est nouveau. D'autre part, ces jours-là
Long code> est rarement plus gros qu'un registre de toute façon, il est donc un peu évident pourquoi il s'agit d'une telle concession :-)
Nous n'avons pas besoin de la possibilité de renvoyer plusieurs valeurs intégrées à la langue C ++, car la bibliothèque fonctionne simplement bien:
std::tuple<int,float> func() { return std::make_tuple(1, 2.f); } int i; float f; std::tie(i, f) = func();
Ce n'est pas vraiment la bibliothèque "standard" - au moins jusqu'à ce que c ++ 0x soit ratifiée.
En réalité, il y a au moins 2 façons de renvoyer plusieurs valeurs. P>
d'abord consiste à revenir à créer une structure ou une classe, mettez toutes les données de retour et renvoyez-la. P>
second est de passer des paramètres par référence (non-const) et de mettre les valeurs là-bas. P>
Si le génie ne vous a donné qu'un seul souhait, vous pouvez simplement souhaiter avoir un certain nombre de souhaits. C'est la même chose avec une seule valeur de retour d'une méthode. Vous pouvez utiliser votre valeur de retour en tant que pointeur sur une adresse où réside un objet rempli d'attributs, puis interroge ces attributs (propriétés) ... de cette façon il n'y a vraiment aucune limitation. : -) p>
codage amusant et beaucoup de retours heureux: -) p>
C'est principalement dû à des raisons historiques menées avec des conventions d'appel machine. En outre, parce que C n'a pas de syntaxe correspondant de modèle sur le côté de la callee pour récupérer les résultats. Notez que des langues comme ML ou HASKELL ont un type de tuple syntaxiquement léger qui est parfaitement utilisable pour renvoyer plusieurs valeurs.
édité: p>
y pensant un peu, je suppose que si vous vouliez diviser les cheveux , Ml et Haskell ont toujours une valeur de retour "simple". C'est juste que les tuples sont tellement légers syntaxiquement qu'il est pratique de penser à des fonctions qui renvoient plusieurs valeurs plutôt qu'une seule tuple. P>
Pour être totalement rigoureux, il y a deux langues que je peux penser à «bon». Les retours de valeurs multiples qui ne sont pas seulement des tuples de forme. L'un est un schéma (cf dans ces deux langues, il y a un Une distinction syntaxique spéciale entre une valeur unique qui se trouve être un agrégat (cellule de la client, une matrice, respectivement) et plusieurs valeurs. P> P> des valeurs d'appel code>), et l'autre est MATLAB: p>
C'est juste une décision et parce que les gens y sont habitués. En principe, il n'y aurait rien d'empêcher un concepteur de langue de mettre en œuvre une syntaxe comme celui-ci:
(err, filehandle) = OpenFileDialog(...)
La déclaration code> code> serait intéressante aussi :)
Python, par exemple, utilise une syntaxe très similaire à celle-ci pour dissimuler des fonctions qui renvoient des tuples, ils semblent donc renvoyer plusieurs valeurs. Et dans le cas de Python, vous n'avez pas à déclarer quelle fonction retourne, vous éviterez donc le effrayant (int, int, int) code>.
Peut-être que je ne suis tout simplement pas très bon dans tout ce domaine de programmation, mais cela semble juste déroutant. :)
@Steve: Merci je ne suis pas assez bon en python, même si je me suis souvenu de ce que c'était possible. Je dois avouer que j'ai effectivement choisi C ++ comme syntaxe, car il a l'air plus drôle. Nous pourrions ajouter une quantité arbitraire de confusion en permettant aux valeurs de retour nommées.
@Jay: attendez jusqu'à ce que vous voyez ce qui se passe en python lorsque vous souhaitez ignorer l'une des trois valeurs de retour. _ code> est un nom de variable valide et les variables ne doivent pas nécessairement être pré-déclarées. L'idiome est donc
a, _, c = appel (1,2,3) code >! Par exemple,
préfixe, _, suffixe = "FOO-BAR" .Partition ("-") code>. Maintenant,
préfixe code> est
"foo" code>,
suffixe code> est
"bar" code> et
_ code> _ code> est
"-" code>, mais nous ne prévoyons pas d'utiliser cela.
Il est utile de le soutenir et de la manière dont les gens le trouvent pratique dans d'autres langues, C et Java peuvent également déplacer ainsi.
C ++ standardise déjà sur le type de pratique pratique et intuitive. Manipulation des valeurs de retour familières par exemple Ruby et Python pour le côté de l'appelant de fonction em> strong>, ce qui est plus important que sur le code> code> lui-même, car une seule fonction est probablement appelée à partir d'un grand sites d'appel. Spécialement, le papier C ++ 17 ici (voir aussi Wording ici ) documente une notation ... p> ... Où expression peut être une fonction de retour - ou toute autre expression évaluant à une matrice, a La fonctionnalité décrit également cette ... P> tuple code> ou a
struct code> avec tous les membres du code code>. Ce qui précède peut être précédé par
const code> pour rendre les variables locales
const code>. P>
for (const auto& [key,value] : mymap)
...
Ceci est un non-sens. Une fonction peut renvoyer plusieurs valeurs (comme exemple, voir la réponse de Nawaz)
Connexes: Stackoverflow.com/Questtions/321068/ ...
Bien que sa question plus philosophique, la valeur signifie une instance d'objet peut être structurée ou objet. Le tumle est un bon exemple que je n'étais pas au courant. [hors de certaines limites Tout a l'air non-sens]
@Vjo: Pour être pédant, c'est toujours une seule valeur. Il se trouve que d'agréger.
@Gman: +1. Le point à laquelle la question invoquée registres est le point auquel cela est clairement devenu une question philosophique et non un "comment je suis?" un.