www.mikrocontroller.net

Forum: PC-Programmierung Problem mit Default Parameter


Autor: L. J. (luke1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute,

Irgendwie habe ich mich gerade selbst verwirrt und blicke nicht mehr 
wirklich durch.
#include <iostream>
using namespace std;

int foo(int value=0)
{
    static int val=0;
    val=value;
    return val;
}

int main(void)
{
  
    foo(1);
    cout<<foo()<<"\n";
    cin.get();
}
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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
foo();

ist gleichbedeutet mit

foo(0);

Autor: L. J. (luke1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <iostream>
using namespace std;

int foo(int value=0)
{
      static int val=0;
      if(value!=0) val=value;
      return val;
}
int main()
{
      foo(3);
      cout<<foo()<<'\n';
}
Dann versteh ich nicht, wieso das so funktioniert..

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erste Version:
...
/* Rufe foo() mit Argument 1
--> Setze statische Variable in foo() auf 1 */
foo(1);

/* Rufe foo() ohne Argumente
--> Standardargument wird verwendet
--> Setze statische Variable in foo() auf 0 */
cout << foo() << endl;
...

Autor: L. J. (luke1)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... Hast du schonmal nen Debugger gesehn?
Zweite Version:
...
/* Rufe foo() mit Argument 3
--> '3' ist nicht gleich '0'
--> Merke '3' in der statischen Variablen
--> Gib den gerade gemerkten Wert zurück */
foo(3)

/* Rufe foo() ohne Argumente
--> Nimm '0', also das Standardargument
--> '0' ist gleich '0', also merke nichts
--> gib den irgendwann mal gemerkten Wert zurück
--> der ist '3' vom vorigen Ruf, also drucke '3' */
cout << foo() << endl;
...

Autor: L. J. (luke1)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.