Parameter (Computerprogrammierung)

Im Computerprogrammierung, a Parameter oder ein formales Argument ist eine besondere Art von Variable verwendet in a Subroutine Um sich auf eines der als Eingabe in die Unterroutine bereitgestellten Daten zu beziehen.[a][1] Diese Datenstücke sind die Werte[2][3][4] des Argumente (oft angerufen tatsächliche Argumente oder tatsächliche Parameter) mit der die Unterroutine genannt/aufgerufen wird. Eine geordnete Liste von Parametern ist normalerweise in der enthalten Definition eines Unterprogramms, damit die Argumente für diesen Aufruf jedes Mal bewertet werden und die resultierenden Werte den entsprechenden Parametern zugewiesen werden können.

nicht wie Streit in üblicher mathematischer Verwendung, die Streit In der Informatik ist der tatsächliche Eingabefreundlichkeitsausdruck, der in der Aufruf/Anrufanweisung an eine Funktion, ein Verfahren oder eine Routine geliefert wurde, während die Parameter ist die Variable innerhalb der Implementierung der Unterroutine. Zum Beispiel, wenn man das definiert hinzufügen Unterroutine als Def add (x, y): Rückgabe x + y, dann x, y sind Parameter, während dies als als als genannt wird hinzufügen (2, 3), dann 2, 3 sind die Argumente. Beachten Sie, dass Variablen (und Ausdrücke davon) aus dem aufrufenden Kontext Argumente sein können: Wenn die Unterroutine als aufgerufen wird a = 2; B = 3; hinzufügen (a, b) dann ist die Variablen a, b sind die Argumente, nicht die Werte 2, 3. Siehe das Parameter und Argumente Abschnitt für weitere Informationen.

Die Semantik, wie Parameter deklariert werden können und wie der (Wert) Argumente an die Parameter von Unterprogrammen übergeben werden, werden durch die definiert Bewertungsstrategie der Sprache und die Details, wie dies in einem bestimmten Computersystem dargestellt wird Konvention anrufen von diesem System. Im häufigsten Fall, Rufen Sie nach Wert an, ein Parameter wirkt innerhalb der Unterroutine als neue lokale Variable, die zum Wert des Arguments initialisiert wurde (a lokal (isoliert) Kopie des Arguments Wenn das Argument eine Variable ist), in anderen Fällen, z. Rufen Sie durch Referenz anDie vom Anrufer gelieferte Argumentvariable kann durch Maßnahmen innerhalb der genannten Unterroutine beeinflusst werden.

Beispiel

Das folgende Programm in der C Programmiersprache Definiert eine Funktion, die als "Salestax" bezeichnet wird und einen Parameter mit dem Namen "Preis" hat. Die Art des Preises ist "doppelt" (d. H. a Schwimmpunkt doppelte Präzision Nummer). Der Rückgabetyp der Funktion ist ebenfalls doppelt.

doppelt Mehrwertsteuer(doppelt Preis) {   Rückkehr 0,05 * Preis; } 

Nachdem die Funktion definiert wurde, kann sie wie folgt aufgerufen werden:

Mehrwertsteuer(10.00); 

In diesem Beispiel wurde die Funktion mit dem aufgerufen Streit 10.00. In diesem Fall wird 10.00 dem Preis zugeordnet, und die Funktion beginnt, ihr Ergebnis zu berechnen. Die Schritte zur Erzeugung des Ergebnisses sind nachstehend angegeben ({} eingeschlossen. 0,05 * Preis Zeigt an, dass das erste, was zu tun ist, 0,05 mit dem Wert des Preises multiplizieren, was 0,50 ergibt. Rückkehr bedeutet, dass die Funktion das Ergebnis von erzeugt 0,05 * Preis. Daher beträgt das Endergebnis (ignorierte mögliche rund-off-Fehler, die mit Dezimalfraktionen als binäre Fraktionen darstellen) 0,50.

Parameter und Argumente

Die Begriffe Parameter und Streit Kann unterschiedliche Bedeutungen in verschiedenen Programmiersprachen haben. Manchmal werden sie austauschbar verwendet, und der Kontext wird verwendet, um die Bedeutung zu unterscheiden. Der Begriff Parameter (manchmal genannt formaler Parameter) wird oft verwendet, um die Variable zu beziehen, wie in der Funktionsdefinition gefunden wird Streit (manchmal genannt Tatsächlicher Parameter) bezieht sich auf die tatsächliche Eingabe, die beim Funktionsaufruf geliefert wird. Zum Beispiel, wenn man eine Funktion als definiert als def f (x): ..., dann x ist der Parameter und wenn er von aufgerufen wird von a = ...; Fa) dann a ist das Argument. Ein Parameter ist eine (ungebundene) Variable, während das Argument a sein kann wörtlich oder variable oder komplexere Expression, die Literale und Variablen betrifft. Im Falle des Anrufs nach Wert ist das, was an die Funktion übergeben wird, der Wert des Arguments - zum Beispiel, f (2) und a = 2; Fa) sind äquivalente Aufrufe - während im Anruf per Referenz mit einer Variablen als Argument übergeben wird, ist ein Verweis auf diese Variable - obwohl die Syntax für den Funktionsaufruf gleich bleiben könnte.[5] Die Spezifikation für Pass-by-Reference oder Pass-by-Wert würde in der Funktionserklärung und/oder in der Definition erfolgen.

Parameter werden in Prozedurdefinitionen angezeigt. Argumente werden in Verfahrensaufrufen angezeigt. In der Funktionsdefinition f (x) = x*x Die Variable x ist ein Parameter; im Funktionsaufruf f (2) Der Wert 2 ist das Argument der Funktion. Lose ist ein Parameter ein Typ und ein Argument ist eine Instanz.

Ein Parameter ist eine intrinsische Eigenschaft des Verfahrens, die in seiner Definition enthalten ist. In vielen Sprachen würde beispielsweise ein Verfahren zum Hinzufügen von zwei mitgelieferten Zahlen zusammengefügt und die Summe berechnet, die zwei Parameter für jede Ganzzahl benötigen. Im Allgemeinen kann ein Verfahren mit einer beliebigen Anzahl von Parametern oder gar keinen Parametern definiert werden. Wenn eine Prozedur Parameter hat, wird der Teil seiner Definition, der die Parameter angibt Parameterliste.

Im Gegensatz dazu sind die Argumente die Ausdrücke[6] Zu der Prozedur geliefert, wenn es aufgerufen wird, normalerweise ein Ausdruck, der einem der Parameter entspricht. Im Gegensatz zu den Parametern, die einen unveränderlichen Teil der Definition des Prozesses bilden, können die Argumente vom Anruf zum Anruf variieren. Jedes Mal, wenn ein Verfahren aufgerufen wird, wird der Teil des Verfahrensaufrufs, der die Argumente angibt Argumentliste.

Obwohl Parameter auch allgemein als Argumente bezeichnet werden, werden Argumente manchmal als die tatsächlichen Werte oder Referenzen angesehen, die den Parametervariablen zugewiesen sind, wenn die Unterroutine aufgerufen wird Laufzeit. Wenn Sie Code diskutieren, der in eine Unterprogramme aufgerufen wird, sind alle Werte oder Referenzen, die in die Unterroutine übergeben wurden Parameterliste. Wenn Sie den Code in der Unterprogrammdefinition diskutieren, sind die Variablen in der Parameterliste des Subroutine die Parameter, während die Werte der Parameter zur Laufzeit die Argumente sind. Zum Beispiel ist es bei C, wenn es mit Threads zu tun hat, üblich, ein Argument von Typ void* zu übergeben und es auf einen erwarteten Typ zu wirken:

Leere Fadenfunktion(Leere* pthreadargument) {   // Die Benennung des ersten Parameters 'pThreadargument' ist eher korrekt als   // 'pthreadparameter'. Zur Laufzeit ist der von uns verwendete Wert ein Argument. Wie   // oben erwähnt, behalten Sie den Begriff Parameter für die Erörterung des Diskussions   // Unterroutine -Definitionen. } 

Um den Unterschied besser zu verstehen, betrachten Sie die folgende Funktion in C:

int Summe(int Addend1, int Addend2) {   Rückkehr Addend1 + Addend2; } 

Die Funktion Summe hat zwei Parameter, benannt Addend1 und Addend2. Es fügt die in die Parameter übergebenen Werte hinzu und gibt das Ergebnis in den Anrufer des Unterroutins zurück (unter Verwendung einer Technik, die automatisch vom C -Compiler geliefert wird).

Der Code, der das aufruft Summe Funktion könnte so aussehen:

int Wert1 = 40; int Wert2 = 2; int sum_value = Summe(Wert1, Wert2); 

Die Variablen Wert1 und Wert2 werden mit Werten initialisiert. Wert1 und Wert2 sind beide Argumente an die Summe Funktion in diesem Zusammenhang.

Zur Laufzeit werden die dieser Variablen zugewiesenen Werte an die Funktion übergeben Summe als Argumente. In dem Summe Funktion, die Parameter Addend1 und Addend2 werden bewertet, was die Argumente 40 bzw. 2 ergibt. Die Werte der Argumente werden hinzugefügt und das Ergebnis wird an den Anrufer zurückgegeben, wo es der Variablen zugewiesen ist sum_value.

Aufgrund des Unterschieds zwischen Parametern und Argumenten ist es möglich, einem Verfahren unangemessene Argumente zu liefern. Der Anruf kann zu viele oder zu wenige Argumente liefern; Ein oder mehrere der Argumente können ein falscher Typ sein; oder Argumente können in der falschen Reihenfolge geliefert werden. Jede dieser Situationen führt zu einer Missverhältnis zwischen den Parametern und den Argumentenlisten, und das Verfahren gibt häufig eine unbeabsichtigte Antwort zurück oder generiert a Laufzeit Fehler.

Alternative Konvention in Eiffel

Innerhalb der Eiffel Softwareentwicklungsmethode und Sprache, die Begriffe Streit und Parameter haben unterschiedliche Verwendungszwecke, die durch Konvention festgelegt wurden. Der Begriff Streit wird ausschließlich in Bezug auf die Eingaben einer Routine verwendet,[7] und der Begriff Parameter wird ausschließlich in der Typparametrisierung für Typ verwendet Generische Klassen.[8]

Betrachten Sie die folgende Routinedefinition:

  Summe (Addend1: GANZE ZAHL; Addend2: GANZE ZAHL): GANZE ZAHL  tun  Ergebnis : = Addend1 + Addend2  Ende 

Die Routine Summe nimmt zwei Argumente Addend1 und Addend2, die als Routine bezeichnet werden formelle Argumente. Ein Anruf an Summe an tatsächliche Argumente, wie unten gezeigt mit Wert1 und Wert2.

  sum_value: GANZE ZAHL  Wert1: GANZE ZAHL = 40  Wert2: GANZE ZAHL = 2    sum_value : = Summe (Wert1, Wert2) 

Parameter werden auch als beide angesehen formell oder tatsächlich. Formale generische Parameter werden in der Definition von generischen Klassen verwendet. Im folgenden Beispiel die Klasse HASH-TABELLE wird als generische Klasse deklariert, die zwei formale generische Parameter hat, G Daten von Interesse darstellen und K Darstellung des Hash -Schlüssels für die Daten:

Klasse HASH-TABELLE [G, K -> Hashable]    

Wenn eine Klasse ein Kunde wird, um HASH-TABELLEDie formalen generischen Parameter werden durch tatsächliche generische Parameter in einem generische Ableitung. In der folgenden Attributerklärung,, mein Wörterbuch ist als Zeichenzeichenfolge zu verwenden, die basiert Wörterbuch. Daher werden sowohl Daten als auch wichtige formale generische Parameter durch die tatsächlichen generischen Parameter des Typs ersetzt Saite.

  mein Wörterbuch: HASH-TABELLE [Saite, Saite] 

Datentypen

Im stark getippte Programmiersprachen, jeder Parameter Typ muss in der Verfahrenserklärung angegeben werden. Sprachen verwenden Geben Sie Inferenz ein Versuchen Sie, die Typen automatisch aus dem Körper und Gebrauch der Funktion zu entdecken. Dynamisch getippte Programmiersprachen verschieben die Typauflösung bis zur Laufzeit. Schwach getippte Sprachen führen nur wenig bis gar keine Typauflösung aus und stützen sich stattdessen auf den Programmierer, um es zu korrigieren.

Einige Sprachen verwenden ein spezielles Schlüsselwort (z. Leere) um anzuzeigen, dass die Unterroutine keine Parameter hat; informell Typentheorie, solche Funktionen nehmen eine leere Parameterliste auf (deren Typ nicht ist Leere, sondern eher Einheit).

Argument passieren

Der genaue Mechanismus zum Zuweisen von Argumenten zu Parametern, genannt Argument passieren, abhängig von der Bewertungsstrategie für diesen Parameter verwendet (typischerweise Rufen Sie nach Wert an), die mit Schlüsselwörtern angegeben werden können.

Standardargumente

Einige Programmiersprachen wie z. Ada, C ++, Clojure, Common Lisp,[9] Forran 90,[10] Python, Rubin, Tcl, und Windows PowerShell zulassen a Standardargument explizit oder implizit in der Erklärung eines Unterroutins angegeben werden. Dies ermöglicht dem Anrufer, dieses Argument beim Aufrufen der Unterroutine wegzulassen. Wenn das Standardargument explizit angegeben ist, wird dieser Wert verwendet, wenn er nicht vom Anrufer bereitgestellt wird. Wenn das Standardargument impliziert ist (manchmal durch Verwendung eines Schlüsselworts wie z. Optional) dann liefert die Sprache einen bekannten Wert (wie z. Null, Leer, Null, eine leere Zeichenfolge usw.) Wenn der Anrufer nicht bereitgestellt wird.

POWERSHELL -Beispiel:

Funktion Dokument($ g = 1.21) {  "$ g gigawatts? $ g gigawatts? toll scott!" } 
Ps> Dokument 1,21 Gigawatt? 1,21 Gigawatt? Großartiger Scott! Ps> Dokument 88 88 Gigawatt? 88 Gigawatt? Großartiger Scott! 

Standardargumente können als Sonderfall der Argumentliste der variablen Länge angesehen werden.

Parameterlisten der variablen Länge

Einige Sprachen ermöglichen es, Unterprogramme zu definieren, um a zu akzeptieren variable Anzahl von Argumenten. Für solche Sprachen müssen die Unterprogramme durch die Liste der Argumente durchführen.

POWERSHELL -Beispiel:

Funktion Marty {  $ args | für jeden { "Zurück zum Jahr $ _" } } 
Ps> Marty 1985 Zurück zum Jahr 1985 Ps> Marty 2015 1985 1955 Zurück zum Jahr 2015 Zurück zum Jahr 1985 Zurück zum Jahr 1955 

Namens Parameter

Einige Programmiersprachen - wie zum Beispiel als Ada und Windows PowerShell- Unterprogramme zu haben, um zu haben Namens Parameter. Dadurch kann der Anrufcode mehr sein Selbstdokumentation. Es bietet dem Anrufer auch mehr Flexibilität und ermöglicht häufig, dass die Reihenfolge der Argumente geändert werden oder dass Argumente nach Bedarf weggelassen werden.

POWERSHELL -Beispiel:

Funktion Jennifer($ adjectiveyoung, $ adjectiveold) {  "Junge Jennifer: Ich bin $ adjectiveyoung!"  "Old Jennifer: Ich bin $ adjectiveold!" } 
Ps> Jennifer 'frisch' 'erfahren' Junge Jennifer: Ich bin frisch! Old Jennifer: Ich bin erfahren! Ps> Jennifer -Adjectiveold 'erfahren' -Adjectiveyoung 'frisch' Junge Jennifer: Ich bin frisch! Old Jennifer: Ich bin erfahren! 

Mehrere Parameter in funktionalen Sprachen

Im Lambda -KalkülJede Funktion hat genau einen Parameter. Was als Funktionen mit mehreren Parametern angesehen wird, wird normalerweise in Lambda Calculus als Funktion dargestellt, die das erste Argument nimmt, und gibt eine Funktion zurück, die den Rest der Argumente übernimmt. Dies ist eine Transformation, die als bekannt ist Currying. Einige Programmiersprachen wie Ml und HaskellFolgen Sie diesem Schema. In diesen Sprachen hat jede Funktion genau einen Parameter, und was wie die Definition einer Funktion mehrerer Parameter aussieht, ist tatsächlich tatsächlich syntethischer Zucker Für die Definition einer Funktion, die eine Funktion usw. zurückgibt, usw. Funktionsanwendung ist links-assoziativ In diesen Sprachen sowie in Lambda Calculus wird also eine Anwendung einer Funktion auf mehrere Argumente aussieht, die als die auf das erste Argument angewendete Funktion korrekt bewertet wird, dann die resultierende Funktion, die auf das zweite Argument usw. angewendet wird usw.

Ausgabeparameter

Ein Ausgangsparameter, auch bekannt als ein aus Parameter oder Rückgabeparameter, ist ein Parameter, der für die Ausgabe verwendet wird, und nicht die übliche Verwendung für die Eingabe. Verwendung Rufen Sie durch Referenz an Parameter oder Aufruf nach Wertparametern, bei denen der Wert eine Referenz ist, da Ausgabeparameter in einigen Sprachen, insbesondere C und C ++[b] Während andere Sprachen integrierte Unterstützung für Ausgabeparameter. Zu den Sprachen mit integrierter Unterstützung für Ausgabeparameter gehören Ada[11] (Siehe ADA -Unterprogramme), Forran (seit Forran 90; siehe Fortran "Intent"), verschiedene Verfahrenserweiterungen zu Sql, wie zum Beispiel PL/sql (sehen PL/SQL -Funktionen)[12] und Transact-SQL, C#[13] und die .NET Framework,[14] Schnell,[15] und die Skriptsprache Tscript (sehen Tscript -Funktionserklärungen).

Genauer gesagt kann man drei Arten von Parametern unterscheiden oder Parametermodi: Eingabeparameters, Ausgabeparameter, und Eingabe/Ausgangsparameters; Diese werden oft bezeichnet in, aus, und draußen oder in Out. Ein Eingabeargument (das Argument zu einem Eingabeparameter) muss ein Wert sein, z. Ein Ausgabeargument muss eine zuweisbare Variable sein, es muss jedoch nicht initialisiert werden, jeder vorhandene Wert ist nicht zugänglich und muss ein Wert zugewiesen werden. und ein Eingangs-/Ausgangsargument muss eine initialisierte, zuweisbare Variable sein und optional einen Wert zugewiesen werden. Die genauen Anforderungen und Durchsetzungen variieren zwischen den Sprachen - zum Beispiel in ADA 83 Ausgabeparameter können nur nach der Zuordnung zugewiesen werden, nicht gelesen werden (dies wurde in entfernt ADA 95 um die Notwendigkeit einer Hilfsschublikatorvariable zu entfernen). Diese sind analog zum Begriff a Wert In einem Ausdruck ist ein R-Wert (hat einen Wert), ein L-Wert (kann zugewiesen werden) oder ein R-Wert/l-Wert (hat einen Wert und kann zugewiesen werden), obwohl diese Begriffe spezialisiert sind Bedeutungen in C.

In einigen Fällen werden nur Eingang und Eingang/Ausgabe unterschieden, wobei die Ausgabe als spezifische Verwendung von Eingang/Ausgabe angesehen wird und in anderen Fällen nur Eingang und Ausgabe (jedoch nicht Eingang/Ausgabe) unterstützt werden. Der Standardmodus variiert zwischen den Sprachen: In der Eingabe/Ausgabe von FORTRAN 90 ist standardmäßig, während in C# und SQL -Erweiterungen die Eingabe standardmäßig ist. In TScript wird jeder Parameter explizit als Eingabe oder Ausgabe angegeben.

Syntaktisch ist der Parametermodus im Allgemeinen mit einem Schlüsselwort in der Funktionserklärung angezeigt, wie z. void f (out int x) in C#. Herkömmliche Ausgabeparameter werden häufig am Ende der Parameterliste eingestellt, um sie klar zu unterscheiden, obwohl dies nicht immer befolgt wird. TScript verwendet einen anderen Ansatz, bei dem in den Funktionen der Funktionserklärung Eingabeparameter aufgeführt sind, dann die Ausgabeparameter, die durch einen Dickdarm getrennt sind (:) und es gibt keinen Rückgabetyp für die Funktion selbst, wie in dieser Funktion, die die Größe eines Textes berechnet Fragment:

Textextent(Wstring Text, Schriftart Schriftart : Ganze Zahl Breite, Ganze Zahl Höhe) 

Parametermodi sind eine Form von Denotationssemantikmit der Absicht des Programmierers und ermöglicht Compiler, Fehler zu fangen und Optimierungen anzuwenden - sie deuten nicht unbedingt impliziert Betriebssemantik (Wie der Parameterübergang tatsächlich auftritt). Insbesondere, während Eingabeparameter per Call by Value sowie Ausgabe- und Eingabe-/Ausgangsparameter per Call per Referenz implementiert werden können-und dies ist eine einfache Möglichkeit, diese Modi in Sprachen ohne integrierte Unterstützung zu implementieren-dies ist nicht immer so, wie sie sind implementiert. Diese Unterscheidung wird ausführlich in der detailliert erörtert Ada '83 Begründung, Dies betont, dass der Parametermodus abstrahiert wird, aus welchem ​​Parameterübergangsmechanismus (durch Referenz oder Kopie) tatsächlich implementiert ist.[11] Zum Beispiel werden in C# Eingabeparametern (Standard, kein Schlüsselwort) nach Wert und Ausgabe- und Eingabe-/Ausgangsparametern (Parameter (Ausgabe) übergeben (Parameter (Ausgabe) (Parameter) (Parameter auszugebenaus und Ref) werden durch Referenz in PL/SQL -Eingabeparametern (IN) werden durch Referenz- und Ausgabe- und Eingangs-/Ausgangsparameter übergeben (Parameter (AUS und Draußen) werden standardmäßig von Wert übergeben und das Ergebnis zurück kopiert, kann aber mit der Verwendung der Referenz übergeben werden KEINE KOPIE Compiler -Hinweis.[16]

Eine syntaktisch ähnliche Konstruktion wie Ausgabeparameter besteht darin, die zuzuweisen Rückgabewert zu einer Variablen mit demselben Namen wie die Funktion. Dies ist in gefunden in Pascal und Forran 66 und Forran 77wie in diesem Pascal -Beispiel:

Funktion f(x, y: ganze Zahl): ganze Zahl; Start  f : = x + y; Ende; 

Dies ist semantisch unterschiedlich, als die Funktion einfach bewertet wird - sie wird keine Variable aus der Aufruf übergeben Umfang Um die Ausgabe zu speichern.

Verwenden

Die primäre Verwendung von Ausgabeparametern besteht darin, mehrere Werte aus einer Funktion zurückzugeben, während die Verwendung von Eingabe-/Ausgangsparametern darin besteht, den Zustand mithilfe von Parametern zu ändern (und nicht nach gemeinsamer Umgebung, wie in globalen Variablen). Eine wichtige Verwendung der Rückgabe mehrerer Werte besteht darin, die zu lösen Semipredicate -Problem sowohl einen Wert als auch einen Fehlerstatus zurückzugeben - siehe Semipredicate -Problem: Mehrwertiger Rendite.

Um beispielsweise zwei Variablen aus einer Funktion in C zurückzugeben, kann man schreiben:

int Breite int Höhe; F(x, &Breite, &Höhe); 

wo x ist ein Eingabeparameter und Breite und Höhe sind Ausgangsparameter.

Ein gemeinsamer Anwendungsfall in C und verwandten Sprachen ist für Ausnahmebehandlung, wobei eine Funktion den Rückgabewert in eine Ausgabevariable platziert und einen Booleschen zurückgibt, der entspricht, ob die Funktion erfolgreich ist oder nicht. Ein archetypisches Beispiel ist das TryParse Methode in .NET, insbesondere C#, die eine Zeichenfolge in eine Ganzzahl analysiert und zurückkehrt Stimmt über Erfolg und FALSCH beim Versagen. Dies hat die folgende Unterschrift:[17]

Öffentlichkeit statisch bool TryParse(Saite s, aus int Ergebnis) 

und kann wie folgt verwendet werden:

int Ergebnis; wenn (!INT32.TryParse(s, Ergebnis)) {  // Ausnahmebehandlung } 

Ähnliche Überlegungen gelten für die Rückgabe eines Werts eines von mehreren möglichen Typen, wobei der Rückgabewert den Typ angeben kann und der Wert in einer von mehreren Ausgabevariablen gespeichert wird.

Nachteile

Die Ausgangsparameter werden in der modernen Programmierung oft entmutigt, im Wesentlichen als unangenehm, verwirrend und zu niedrig-alltägliche Rückgaberückwerte sind erheblich einfacher zu verstehen und zu arbeiten.[18] Bemerkenswerterweise umfassen Ausgangsparameter Funktionen mit Nebenwirkungen (Änderung des Ausgangsparameters) und ähneln semantisch den Referenzen, die verwirrender sind als reine Funktionen und Werte, und die Unterscheidung zwischen Ausgangsparametern und Eingangs-/Ausgangsparametern kann subtil sein. Da in gemeinsamen Programmierstilen die meisten Parameter einfach Eingabeparameter sind, sind Ausgabeparameter und Eingangs-/Ausgangsparameter ungewöhnlich und daher anfällig für Missverständnisse.

Ausgabe- und Eingangs-/Ausgangsparameter verhindern FunktionszusammensetzungDa der Ausgang in Variablen und nicht im Wert eines Ausdrucks gespeichert ist. Somit muss man zunächst eine Variable deklarieren, und dann muss jeder Schritt einer Funktionskette eine separate Aussage sein. In C ++ beispielsweise die folgende Funktionszusammensetzung:

Objekt obj = G(y, F(x)); 

Wenn stattdessen mit Ausgangs- und Eingangs-/Ausgangsparametern geschrieben wird F Es ist ein Ausgangsparameter für G ein Eingangs-/Ausgangsparameter):

Objekt obj; F(x, &obj); G(y, &obj); 

Im speziellen Fall einer Funktion mit einem einzelnen Ausgangs- oder Eingangs-/Ausgangsparameter und ohne Rückgabewert ist eine Funktionszusammensetzung möglich, wenn der Ausgangs- oder Eingangs-/Ausgangsparameter (oder in C/C ++, ihre Adresse) auch von der Funktion zurückgegeben wird. In diesem Fall wird das oben genannte:

Objekt obj; G(y, F(x, &obj)); 

Alternativen

Es gibt verschiedene Alternativen zu den Anwendungsfällen von Ausgabeparametern.

Für die Rückgabe mehrerer Werte aus einer Funktion besteht eine Alternative darin, a zurückzugeben Tupel. Syntaktisch ist dies klarer, wenn die automatische Sequenzpackung und parallele Aufgabe kann wie in verwendet werden gehen oder Python, wie:

def f():  Rückkehr 1, 2 a, b = f() 

Für die Rückgabe eines Wertes eines von mehreren Typen, a Tagged Union kann stattdessen verwendet werden; Die häufigsten Fälle sind Nullbare Typen (Optionstypen), wobei der Rückgabewert null sein kann, um einen Fehler anzuzeigen. Für die Ausnahmebehandlung kann man einen nullierbaren Typ zurückgeben oder eine Ausnahme ausschöpfen. Zum Beispiel könnte in Python einer haben:

Ergebnis = analysieren(s) wenn Ergebnis ist Keiner:  # Ausnahmebehandlung 

oder idiomatischer:

Versuchen:  Ergebnis = analysieren(s) außer Parseerror:  # Ausnahmebehandlung 

Die Mikrooptimierung, keine lokale Variable zu erfordern und die Rückgabe bei der Verwendung von Ausgangsvariablen zu kopieren, kann auch auf herkömmliche Funktionen und Rückgabeteile durch ausreichend ausgedehnte Compiler angewendet werden.

Die übliche Alternative zu Ausgabeparametern in C und zugehörigen Sprachen besteht darin, eine einzelne Datenstruktur mit allen Rückgabewerten zurückzugeben.[13] Beispielsweise kann man bei einer Struktur Breite und Höhe einschränken, kann man schreiben:

Breite Höhe Breite und Höhe = F(x); 

In objektorientierten Sprachen kann man anstelle von Eingabe-/Ausgaberametern häufig verwendet werden Rufen Sie an, indem Sie teilenÜbergeben eines Verweiss auf ein Objekt und dann mutieren Sie das Objekt, obwohl dies nicht geändert wird, auf welches Objekt die Variable bezieht.[18]

Siehe auch

Anmerkungen

  1. ^ In diesem Artikel bezieht sich der Begriff "Unterroutine" auf jedes subroutineähnliche Konstrukt, das je nach der Programmiersprache wird besprochen.
  2. ^ C und C ++ werden nach Wert aufgerufen. Wenn jedoch ein Typ eine Referenz ist (ein C/C ++ -Recinter oder C ++ - Referenz), kann das Festlegen des Wertes der Referenz verwendet werden, um den Aufruf durch Referenzstilverhalten zu erzeugen.

Verweise

  1. ^ "Informationen an eine Methode oder einen Konstruktor übergeben (die Java ™ -Tutorials> Lernen der Java -Sprache> Klassen und Objekte)". Oracle.com. Abgerufen 2021-09-09. Die Parameter beziehen sich auf die Liste der Variablen in einer Methodenerklärung. Argumente sind die tatsächlichen Werte, die übergeben werden, wenn die Methode aufgerufen wird. Wenn Sie eine Methode aufrufen, müssen die verwendeten Argumente mit den Parametern der Deklaration in Typ und Reihenfolge übereinstimmen.
  2. ^ Prata, Stephen (2004). C Primer Plus (5. Aufl.). Sams. p. 276–277. ISBN 978-0-672-32696-7.
  3. ^ "Arbeitsentwurf, Standard für die Programmiersprache C ++" (PDF). www.openstd.org. Archiviert von das Original (PDF) am 14. Dezember 2005. Abgerufen 1. Januar 2018.
  4. ^ Gordon, Aaron. "Unterprogramme und Parameterübergang". rowdysiten.msudenver.edu/~gordona. Archiviert von das Original am 1. Januar 2018. Abgerufen 1. Januar 2018.
  5. ^ Dollard, Kathleen. "Argumente nach Wert und Referenz (Visual Basic)" übergeben ". docs.microsoft.com. Abgerufen 2018-10-27.
  6. ^ "Das GNU C -Programmier -Tutorial". crasseux.com. Abgerufen 2018-10-27.
  7. ^ Meyer, Bertrand. Objektorientierte Softwarekonstruktion, 2nd Edition, Prentice Hall, 1997, S. 444.
  8. ^ Meyer, p. 96.
  9. ^ "Funktionen". gigamonkeys.com. Abgerufen 2021-06-02.
  10. ^ "Optionale Argumente". www.netlib.org. Abgerufen 2021-06-02.
  11. ^ a b 8.2 Parametermodi, "Begründung für das Design der ADA® -Programmiersprache"
  12. ^ 8. PL/SQL -Unterprogramme: Angeben von Subprogramm -Parametermodi angeben
  13. ^ a b Peter Hallam. "Warum hat C# sowohl" Ref "als auch" Out "?". Archiviert von das Original Am 2011-09-26.
  14. ^ Parameterdirektion Aufzählung
  15. ^ Funktionen - Die Swift -Programmiersprache (Swift 4.2)
  16. ^ 8. PL/SQL -Unterprogramm: Übergeben großer Datenstrukturen mit dem Nocopy Compiler -Hinweis
  17. ^ Int32.tryParse -Methode (String, Int32)
  18. ^ a b CA1021: Vermeiden Sie die Parameter aus