Funktionen < C/C++ < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 22:47 Di 04.02.2014 | Autor: | rollroll |
Aufgabe | Welche Ausgabe liefert das Programm:
#include<stdio.h>
int a=4;
int func(int a)
{
return(--a);
}
void proc()
{
++a;
}
int main () {
proc();
proc();
func(a);
printf(''a = % i [mm] \n'',a);
[/mm]
return 0;
} |
Hallo,
die Lösung lautet a=6. Mir ist aber nicht klar weshalb...
Der Rückgabewert void bedeutet doch, dass die Funktion nichts zurück gibt. Aber anscheinend tut sie das doch. Obwohl void davor steht, bewirkt die Funktion proc, dass die Variable um 1 erhöht wird. Und warum bewirkt die Funktion func(a) nicht, dass a um 1 verringert wird?
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 23:10 Di 04.02.2014 | Autor: | DieAcht |
Hallo,
Die Variable $a$ ist global definiert, sodass zwar nichts
zurückgegeben, aber der Wert global verändert wird. Zu deinem
zweiten Problem kannst du dir folgendes Beispiel überlegen:
Hier gilt: $a=2$.
Hier gilt: $a=3$.
Soweit sollte es klar sein. In deinem Fall erhältst du nach
zweifacher Anwendung von proc() $a=6$. Ab hier
siehe Antwort von Felix.
Gruß
DieAcht
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 23:44 Di 04.02.2014 | Autor: | felixf |
Moin,
> Die Variable [mm]a[/mm] ist global definiert, sodass zwar nichts
> zurückgegeben, aber der Wert global verändert wird.
genau.
> Zu
> deinem
> zweiten Problem kannst du dir folgendes Beispiel
> überlegen:
>
>
>
> Hier gilt: [mm]a=2[/mm].
>
>
>
> Hier gilt: [mm]a=3[/mm].
>
> Soweit sollte es klar sein. In deinem Fall erhältst du
> nach
> zweifacher Anwendung von proc() [mm]a=6[/mm].
> Nun wird
> mit func(a) [mm]a[/mm] direkt um [mm]1[/mm] verringert und
> zurückgegeben, sodass [mm]a=5[/mm] gilt.
Das stimmt nicht: a ist in func() eine lokale Kopie des Arguments (welches im Funktionsaufruf in main() gleich a ist). Somit wird diese lokale Kopie veraendert, aber nicht die globale Variable gleichen Namens. Der Rueckgabewert von func() wird in main() ignoriert, weshalb die 5 weggeworfen wird. Ausgegeben wird 6.
> Was am Ende auf deiner
> Konsole ausgegeben wird kann ich nicht beurteilen, weil
> es
> unvollständig kopiert ist.
Es sollte "a = 6 " dort stehen (mit zwei Leerzeichen vor der 6 und einem hinter der 6), wenn man die '' als " interpretiert.
LG Felix
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 23:53 Di 04.02.2014 | Autor: | DieAcht |
Hallo Felix,
Danke, dass du aufgepasst hast.
Gruß
DieAcht
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 10:19 Mi 05.02.2014 | Autor: | rollroll |
Hallo nochmal, danke für eure Erklärungen!!
Aber leider ist es mir noch nicht ganz klar geworden.
1. Was ganz konkret bedeutet / bewirkt denn das void vor der Funktion?
2. Dass durch die Funktion proc die globale Variable a=4 jeweils um 1 erhöht wird, ist klar. Aber ich habe immer noch nicht ganz verstanden weshalb nicht nach dem selben Schema a durch die Funktion func(a) um 1 verringert wird. Woran liegt das genau?
3. Habe ich es richtig verstanden, dass das Programm a= 4 ausgeben würde, wenn da a++ statt ++a gestanden hätte?
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 12:26 Mi 05.02.2014 | Autor: | felixf |
Moin!
> Hallo nochmal, danke für eure Erklärungen!!
>
> Aber leider ist es mir noch nicht ganz klar geworden.
> 1. Was ganz konkret bedeutet / bewirkt denn das void vor
> der Funktion?
Es sagt, dass die Funktion nichts zurueck gibt. Du kannst also nicht sowas wie
x = proc()
schreiben, der Compiler meckert dann.
> 2. Dass durch die Funktion proc die globale Variable a=4
> jeweils um 1 erhöht wird, ist klar. Aber ich habe immer
> noch nicht ganz verstanden weshalb nicht nach dem selben
> Schema a durch die Funktion func(a) um 1 verringert wird.
> Woran liegt das genau?
Weil a in func() der Name einer lokalen Variable ist. Dies liegt daran, wie die Funktion func() definiert ist:
1: | int func(int a)
| 2: | {
| 3: | return(--a);
| 4: | } |
Wenn du die Funktion zu
1: | int func(int y)
| 2: | {
| 3: | return(--y);
| 4: | } |
aenderst tut sie genau das gleiche wie vorher, dafuer ist dann jetzt klarer warum die globale Variable a nicht veraendert wird: weil sie in der Funktion nicht vorkommt.
> 3. Habe ich es richtig verstanden, dass das Programm a= 4
> ausgeben würde, wenn da a++ statt ++a gestanden hätte?
Nein. Die Anweisungen (!) a++ bzw. ++a haben (fuer int-Variablen a) die gleiche Semantik: der Wert von a wird um 1 erhoeht.
Einen Unterschied bekommst du erst, wenn du den Wert von den Ausdruecken (!) a++ bzw. ++a anschaust: dieser ist bei der ersten Variante der alte Wert von a (vor dem Erhoehen), und bei der zweiten Variante der neue Wert von a (nach dem Erhoehen).
Hier ist es also voellig egal, ob du ++a oder a++ machst, der Endwert von a im Programm ist dann immer 6.
(In func() dagegen wuerde es einen Unterschied machen, aber nur wenn man den Rueckgabewert von func() auch beachten wuerde. Da er hier ignoriert wird ist der Unterschied nicht sichtbar.)
LG Felix
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 13:53 Do 06.02.2014 | Autor: | rollroll |
Hallo, noch eine Frage in diesem Rahmen. Wie lautet die Ausgabe des Programms?
1 #include <stdio.h>
2
3 int a_ = 10;
4
5 int funktion(int);
6 void prozedur(void);
7
8 int main(void)
9 {
10 prozedur();
11 prozedur();
12 funktion(a_);
13 printf("a_ = [mm] %d\n", [/mm] a_);
14 return 0;
15 }
16
17 void prozedur(void)
18 {
19 a_ *= a_;
20 return;
21 }
22
23 int funktion(int d_)
24 {
25 return(--d_);
26 }
Ausgabe: a_ =
Ich denke, a müsste dann 10000 sein, oder?
|
|
|
|
|
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
Hallo rollroll,
> Hallo, noch eine Frage in diesem Rahmen. Wie lautet die
> Ausgabe des Programms?
>
> 1 #include <stdio.h>
> 2
> 3 int a_ = 10;
> 4
> 5 int funktion(int);
> 6 void prozedur(void);
> 7
> 8 int main(void)
> 9 {
> 10 prozedur();
> 11 prozedur();
> 12 funktion(a_);
> 13 printf("a_ = [mm]%d\n",[/mm]Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
a_);
> 14 return 0;
> 15 }
> 16
> 17 void prozedur(void)
> 18 {
> 19 a_ *= a_;
> 20 return;
> 21 }
> 22
> 23 int funktion(int d_)
> 24 {
> 25 return(--d_);
> 26 }
> Ausgabe: a_ =
>
> Ich denke, a müsste dann 10000 sein, oder?
Ist es auch.
Gruss
MathePower
|
|
|
|