6
votes

Pourquoi les méthodes ne peuvent pas renvoyer plusieurs valeurs

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.


5 commentaires

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.


10 Réponses :


1
votes

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.


0 commentaires

9
votes

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;
}


2 commentaires

@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.



2
votes

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.

juste mes 2 cents.


4 commentaires

Ni C ni C ++ ne sont conçus pour "encourager les programmeurs à faire la bonne chose"


En outre, C ++ renvoie une paire à partir de certaines fonctions de la bibliothèque standard, notamment Carte :: Insérez . 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 Langues de programmation. Cependant bon 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.



18
votes
  1. Parce que dans les jours de C, il y a / était un registre unique utilisé pour contenir la valeur de retour.
  2. Parce que si vous avez besoin de plus de valeurs, vous pouvez simplement renvoyer un struct , référence (en java / c #) ou le pointeur.
  3. Parce que vous pouvez utiliser un paramètre OUT.

    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 (à partir de TR1, C ++ 11 ou de boost) qui correspond effectivement à plusieurs valeurs de retour)


3 commentaires

"Il y a / était un registre unique" - sur ces terrains, nous devrions nous compter chanceux, nous pouvons retourner un long par valeur ;-)


@Steve: Je ne pense pas long long 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 à long . J'étais ditée parce que d'une part, comme vous dites long long est nouveau. D'autre part, ces jours-là Long 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 :-)



0
votes

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();


1 commentaires

Ce n'est pas vraiment la bibliothèque "standard" - au moins jusqu'à ce que c ++ 0x soit ratifiée.



0
votes

En réalité, il y a au moins 2 façons de renvoyer plusieurs valeurs.

d'abord consiste à revenir à créer une structure ou une classe, mettez toutes les données de retour et renvoyez-la.

second est de passer des paramètres par référence (non-const) et de mettre les valeurs là-bas.


0 commentaires

6
votes

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. : -)

codage amusant et beaucoup de retours heureux: -)


0 commentaires

2
votes

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é:

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.

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 des valeurs d'appel ), et l'autre est MATLAB: xxx

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.


0 commentaires

3
votes

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(...)


5 commentaires

La déclaration 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) .


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. _ 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) ! Par exemple, préfixe, _, suffixe = "FOO-BAR" .Partition ("-") . Maintenant, préfixe est "foo" , suffixe est "bar" et _ _ est "-" , mais nous ne prévoyons pas d'utiliser cela.



0
votes

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> xxx pré>

... Où expression peut être une fonction de retour - ou toute autre expression évaluant à une matrice, a 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>

La fonctionnalité décrit également cette ... P>

for (const auto& [key,value] : mymap)
    ...


0 commentaires