default parameter nur am Ende?
-
Darf man Defaultparameter nur am Ende der Parameter setzen?
foo( int a = 42, int b ); // geht nicht bar( int b, int a = 42 ); // geht
-
Ja, muss man.
-
Wie stellst du es dir denn mit Default-Argumenten am Anfang vor? Wie ruft man die Funktion auf?
-
@Nathan: danke
@ArKot: Halt mit einem Argument foo(23), dies wird dann automatisch an dem Parameter ohne Default weitergegeben.
-
defaultorder schrieb:
@ArKot: Halt mit einem Argument foo(23), dies wird dann automatisch an dem Parameter ohne Default weitergegeben.
Naja, der Compiler hat dann nur ein Problem: Wollte der User, dass die 23 an den Parameter ohne Default weitergegeben wird oder hat er schlicht den anderen Parameter vergessen?
Das kann dann zu Überraschungen führen.
-
Nathan schrieb:
Naja, der Compiler hat dann nur ein Problem:
Der Compiler hat gar kein Problem, wenn die Regel ist erstmal alle Parameter ohne Defaultwerte zu füllen und wenns zu viele Argumente sind von links nach rechts ein paar Argumente ohne Default-Wert hinzuzunehmen, dann ist für den Compiler alles eindeutig.
int foo(int a=1,int b,int c=3,int d); foo(1,2);//b=1 und d=2 foo(1,2,3);//a=1,b=2 und d=3 foo(1,2,3,4);//a=1,b=2,c=3,d=4Nathan schrieb:
Wollte der User, dass die 23 an den Parameter ohne Default weitergegeben wird
Offensichtlich ja.
oder hat er schlicht den anderen Parameter vergessen?
Vergesslichkeit ist nie gut. Dieses Argument gilt übrigens genauso mit allen default-Parametern.
Nathan schrieb:
Das kann dann zu Überraschungen führen.
Nur, wenn falsch eingesetzt und dann kann alles zu Überraschungen führen. Ich sehe da kein Problem, vor allem, wenn man es sorgfältig mit einsetzt und Typfehler erzeugt, falls was vergessen wurde.
Es gibt also keine Probleme, es ist halt einfach nicht so.
-
Echt mühsam, wenn die Vorschau nicht geht.
-
Dein Beispiel demonstriert schön, wieso man nicht alles machen sollte, bloß weil es eindeutig regelbar wäre. Brainfuck ist auch eine Sprache in der für einen Compiler eindeutig klar ist, wie der Code zu interpretieren ist. Trotzdem ist die Sprache eher unbeliebt
.
-
Legastheniker schrieb:
@ArKot: Halt mit einem Argument foo(23), dies wird dann automatisch an dem Parameter ohne Default weitergegeben.
Wollen wir eine Umfrage starten, wie viele Programmierer das sinnvoll und intuitiv finden, und das in ihrem Code so nutzen wollen?
-
VB hatte damals eine Lösung für dieses Problem, dort konnte man Parameter einfach leer lassen, also in etwa so:
void f(int a, float b = 42, const char* d = nullptr, int c); f(1, 2, blub, 4); f(1, , , 3);
-
In Python, oder was es Perl, kann man sogar die Reihenfolge der Argumente, beim Aufruf, vertauschen. Da geht schon ziemlich viel.
-
totschlag schrieb:
Es gibt also keine Probleme, es ist halt einfach nicht so.
Aha, du musst es ja wissen.
-
Struppi hat verpennt,
f(radius=1,durchmesser=2);
zuzulassen.double f(double radius,double durchmesser,double exzentrizität=1);
will ich aufrufen als
f(radius=4,durchmesser=5);
und später als
f(durchmesser=5,radius=2);
mir ist doch Schnuppe, welche willkürliche Reihenfolge der Lib-Autor hatte. Ich rede Bedeutung.
-
Defaultparameter machen meistens mehr Arbeit als sie effektiv einsparen. lieber eine weitere Funktion wenn man schon der Meinung ist das sich da nie wieder etwas ändern wird und der Aufruf so richtig.
-
volkard schrieb:
Struppi hat verpennt,
f(radius=1,durchmesser=2);
zuzulassen.Oder er fand die Idee schlecht. Oder das Standardkomittee hat sie abgelehnt.
Siehe z.B. https://groups.google.com/forum/#!topic/comp.std.c/38gO3dmJf0Q
-
untoter__ schrieb:
Defaultparameter machen meistens mehr Arbeit als sie effektiv einsparen.
Kann ich bislang nicht bestätigen, ins besondere wenn sie dazu dienen Codeduplikate zu vermeiden.
-
Arcoth schrieb:
Wie stellst du es dir denn mit Default-Argumenten am Anfang vor? Wie ruft man die Funktion auf?
naja man kann sich durchaus was überlegen
func(, 3);
Ästhetische Gründe würden zumindest die prinzipielle Machbarkeit nicht überwiegen.