Forum: PC-Programmierung Problem mit Default Parameter


von L. J. (luke1)


Lesenswert?

Hi Leute,

Irgendwie habe ich mich gerade selbst verwirrt und blicke nicht mehr 
wirklich durch.
1
#include <iostream>
2
using namespace std;
3
4
int foo(int value=0)
5
{
6
    static int val=0;
7
    val=value;
8
    return val;
9
}
10
11
int main(void)
12
{
13
  
14
    foo(1);
15
    cout<<foo()<<"\n";
16
    cin.get();
17
}
Das ist der Code. Meiner Meinung nach müsste die Ausgabe 1 sein. Es 
müsste doch eine 1 übergeben werden und trotzdem ist das Ergebnis 0. 
Desweiteren habe ich nicht verstanden wieso ich die Funktion foo nicht 
mit int foo(1) aufrufen konnte. Ich habe gerade selbst den Überblick 
verloren.

von Peter (Gast)


Lesenswert?

foo();

ist gleichbedeutet mit

foo(0);

von L. J. (luke1)


Lesenswert?

1
#include <iostream>
2
using namespace std;
3
4
int foo(int value=0)
5
{
6
      static int val=0;
7
      if(value!=0) val=value;
8
      return val;
9
}
10
int main()
11
{
12
      foo(3);
13
      cout<<foo()<<'\n';
14
}
Dann versteh ich nicht, wieso das so funktioniert..

von Sven P. (Gast)


Lesenswert?

Erste Version:
1
...
2
/* Rufe foo() mit Argument 1
3
--> Setze statische Variable in foo() auf 1 */
4
foo(1);
5
6
/* Rufe foo() ohne Argumente
7
--> Standardargument wird verwendet
8
--> Setze statische Variable in foo() auf 0 */
9
cout << foo() << endl;
10
...

von L. J. (luke1)


Lesenswert?

Ja das habe ich verstanden. Nur das merkwürdige ist..Der Code oben 
funktioniert so. Es wird eine 3 ausgegeben. Auch wenn foo bei cout als 
Standardargument aufgerufen wird. Eigentlich müsste da wirklich eine 0 
stehen, tut's aber nicht.

von Sven P. (Gast)


Lesenswert?

... Hast du schonmal nen Debugger gesehn?
Zweite Version:
1
...
2
/* Rufe foo() mit Argument 3
3
--> '3' ist nicht gleich '0'
4
--> Merke '3' in der statischen Variablen
5
--> Gib den gerade gemerkten Wert zurück */
6
foo(3)
7
8
/* Rufe foo() ohne Argumente
9
--> Nimm '0', also das Standardargument
10
--> '0' ist gleich '0', also merke nichts
11
--> gib den irgendwann mal gemerkten Wert zurück
12
--> der ist '3' vom vorigen Ruf, also drucke '3' */
13
cout << foo() << endl;
14
...

von L. J. (luke1)


Lesenswert?

Ah ja ich habe es jetzt verstanden danke :D Natürlich foo wird mit 3 
aufgerufen. Das IST ungleich 0 also erhält val=3. Das merkt er sich. 
Beim cout Aufruf wird es standardgemäß, also mit 0, aufgerufen, aber da 
die Variable sich den Wert gemerkt hat wird eine 3 ausgegeben. 
Dankeschön :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.