kurze frage zu Funktionen

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
AlexImperator
Beiträge: 23
Registriert: Mi Aug 13, 2014 5:25 pm

kurze frage zu Funktionen

Beitrag von AlexImperator » Do Aug 28, 2014 2:41 pm

wenn ich int den prototyp

Code: Alles auswählen

add( int left, int right );
deklariere was macht es für einen unterschied wenn man left und right in der kalmmer deklatiert? und nicht

Code: Alles auswählen

int add()
{
  int left;
  int right;
}
oder

Code: Alles auswählen

int left;
int right;

int add();
{
     return left+right;
}

int main
{
     summe=add();
     return 0;
}
wahrscheinlich ne dumme frage aber ich hab nicht ganz verstanden was bei add( int left, int right ); passiert... ist das eine art speicher auf den andere funktieonen wie main zugreifen können?

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: kurze frage zu Funktionen

Beitrag von Xin » Do Aug 28, 2014 2:54 pm

AlexImperator hat geschrieben:wenn ich int den prototyp

Code: Alles auswählen

add( int left, int right );
deklariere was macht es für einen unterschied wenn man left und right in der kalmmer deklatiert? und nicht

Code: Alles auswählen

int add()
{
  int left;
  int right;
}
Das ist eine Funktion, der Du keine Argumente übergeben kannst, die aber zwei lokale Variablen besitzt. Ein Argument ist nichts anderes als eine lokale Variable, ein Argument wird aber durch den Funktionsaufruf von außen mit einem Wert belegt - eine lokale Variable musst Du selbst mit einem Wert belegen. Vor allem aber kann die rufende Funktion den Wert einer lokalen Variable nicht beeinflussen.
AlexImperator hat geschrieben: oder

Code: Alles auswählen

int left;
int right;

int add();
{
     return left+right;
}

int main
{
     summe=add();
     return 0;
}
Hier hast Du zwei globale Variablen. An diese Variablen darf jeder ran und es gibt sie nur ein einziges Mal. Wenn die Funktion add sich selbst aufruft (das nennt sich Rekursion), ist sie wieder an genau diese beiden Variablen gebunden. Rekursion ist mit globalen Variablen also recht unhandlich.
Auch hier musst Du left und right erst belegen, bevor Du add aufrufen kannst und ein sinnvolles ergebnis erwarten kannst. Bei Parametern musst Du die belegung im Funktionsaufruf mitgeben:

Code: Alles auswählen

add( 1, 2 );
Du kannst es also nicht vergessen und Du kannst innerhalb von add(1,2) auch noch add(2,3) aufrufen, ohne dass sich die Variablen in die Quere kommen.
AlexImperator hat geschrieben:wahrscheinlich ne dumme frage aber ich hab nicht ganz verstanden was bei add( int left, int right ); passiert... ist das eine art speicher auf den andere funktieonen wie main zugreifen können?
Eben nicht. Als Parameter findet ein Austausch zwischen der rufenden und der gerufenen Funktion statt. Keine anderen Funktionen haben Einfluss auf Parameter. Bei globalen Variablen haben alle Zugriff, bei lokalen nur die Funktion in der die Variablen definiert sind (außer es werde Referenzen auf die Variablen weitergegeben).
Globale Variablen solltest Du möglichst vermeiden.

Dumme Fragen gibt es nicht. Und wer keine Fragen stellt wird nicht klüger. Passt also.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: kurze frage zu Funktionen

Beitrag von cloidnerux » Do Aug 28, 2014 3:39 pm

wenn ich int den prototyp

Code: Alles auswählen

add( int left, int right );
deklariere was macht es für einen unterschied wenn man left und right in der kalmmer deklatiert?
Dein Compiler unterscheidet Funktionen anhand des Namens und der zu übergebenden Parameter.
Du kannst zwei Funktionen "add" haben, solange die Parameter sich unterscheiden:

Code: Alles auswählen

int add(int left, int right); //add(int, int)
int add(float left, float right);//Das ist ok
int add(int right, int left); //das ist nicht oK wegen add(int, int) 
Wichtig in diesem Kontext zu erwähnen ist wie dein Compiler eine Funktion handhabt. Zur Identifikation, welche Funktion zu nutzen ist wird nur der Name der Funktion sowie die Reinfolge und typen der Parameter. Dein

Code: Alles auswählen

int add(int left, int right);
ist für die Identifikation nur ein

Code: Alles auswählen

int add(int, int);
Eine Funktion "add", die zwei ints als Parameter haben will. Und mehr muss man als Deklaration z.B in einem Header nicht schreiben um bekannt zu geben, dass es eine Funktion "add" gibt, die zwei ints als Parameter benötigt.

Für die Implementation wird dann wieder auf die Variablennamen zurück gegriffen.
und nicht

Code: Alles auswählen

int add()
{
  int left;
  int right;
}
Die Parameter in den Klammern sind dafür gedacht, dass sie beim Aufruf der Funktion vom Aufrufer übergeben werden müssen:

Code: Alles auswählen

int sum = add(2, 5);
Die lokalen Parameter sind wie der Name schon sagt lokal. Der Aufrufer kann und muss sie dir nicht übergeben, was sollte deine Funktion "add" in diesem Fall machen?

Weiterhin solltest du dir auch mal über das Konzept "Funktion" Gedanken machen. Was du egt versuchst ist ein in sich geschlossenen Block zu bauen, der nur von den Variablen abhängt, die du als Parameter übergibst.
Wenn du globale Variablen nutzt, um das Ergebnis einer Funktion zu beeinflussen bedeutet das für dich, dass du vor dem Aufruf der Funktion sicherstellen musst, dass diese Variablen sinnvolle Werte beinhalten.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Antworten