Was sagt denn dein C-Buch zu diesem Thema?
Wenn eine Funktion void als Rückgabeparameter hat, wie sollte dann ihr
Rückgabewert und damit mit der Parameter von return aussehen?
Oliver
selbst wenn dein return wert (int) ist, gibt es kein "richtig" oder
"falsch".
Manchmal macht es der Übersicht halber Sinn, einen func call in das
return zu packen, manchmal nicht.
1
intfputc(intc,FILE*f){
2
return(SendChar(c));
3
}
4
[c]
5
6
[c]
7
intfunc(inta){
8
intstatus=0;// ok
9
10
status=funcA(a);
11
...
12
return(status);
13
}
Der Compiler macht nichts anderes, als dir hier eine Variable (in
welcher Form auch immer, idR. Register) "einzufügen", in welcher der
Rückgabewert von SendChar steht, wenn SendChar beendet ist. Dieser Wert
wird dann von fputc zurückgegeben.
VG,
/th.
thorstendb schrieb:> ... und wenn dein compiler deinen 2. C block nicht anmeckert, such dir> besser nen neuen :-)
Warum? Abgesehen von dem "..." ist das völlig korrektes C++.
Rufus Τ. Firefly schrieb:> Rolf Magnus schrieb:>> Warum? Abgesehen von dem "..." ist das völlig korrektes C++.>> Das bezweifle ich:
Ist aber so. Man beachte, daß ich "C++" schrieb, nicht "C". Da wäre das
nämlich ein Fehler.
> void Test(int a, char b)> {> char x;> ...>> return Aufruf(&a, &x); // was wird hier zurückgegeben?
Nichts.
> }
@all:
Das void kein Rückgabewert hat ist mir bekannt. Demnach sollte
theoretisch auch das erlaubt sein:
1
voidTest(inta,charb)
2
{
3
charx;
4
...
5
Aufruf(&a,&x);
6
}
(gänzlich ohne "return")
@thorstendb:
Bei deinen Beispielen erwartet der Compiler einen Rückgabewert. Bei void
nicht...
@Remote One:
Dein Link verweist auf das C#-Programmierhandbuch.
thorstendb schrieb:> ... und wenn dein compiler deinen 2. C block nicht anmeckert, such dir> besser nen neuen :-)
Hm, dann muss ich jetzt wohl den gcc 'wegwerfen'.
Gibt bei mir noch nicht mal eine Warnung, scheint also korrektes C zu
sein.
Peter R. schrieb:> Demnach sollte> theoretisch auch das erlaubt sein:> ...
Ist es auch praktisch.
Aber trotzdem solltest du jetzt erst einmal klarstellen, um welche
Sprache es nun eigentlich geht: C, C++, C#, ...
Oliver
du hast recht, man kann tatsächlich (void) return-en.
Ich hatte eher etwas wie dieses erwartet:
1
error C2562: 'func' : 'void' function returning a value
Dass man einen (void *) zurückgibt, macht Sinn, das ist tatsächlich ein
pointer, vgl. malloc). Aber wozu sollte man einen (void) zurückgeben?
Was "kommt" da? Was soll das? **verwirrt**
Das hier hingegen:
thorstendb schrieb:> return(status);
Macht jedoch nie Sinn und zeugt nur von einem mangelhaften
Sprachverständniss, obwohl oft gesehen...
"return" ist ein Operator, keine Funktion o.Ä.
return(42) + 23;
macht dasselbe wie
return 42 + 23;
und
return (42 + 23);
und das ist was anderes als
return 42;
tested schrieb:> Hm, dann muss ich jetzt wohl den gcc 'wegwerfen'.> Gibt bei mir noch nicht mal eine Warnung, scheint also korrektes C zu> sein.>../test.c:20: warning: ISO C forbids 'return' with expression, in >function
returning void
Soviel dazu.
Allerdings kommt die Warnung nur mit -pedantic, und wer ist das schon ;)
Oliver
tested schrieb:> scheint also korrektes C zu sein.
Daraus, daß gcc (oder irgendein beliebiger Compiler) es akziptiert, kann
man nicht zwingend darauf schließen, daß der Code korrekt ist. Die beste
Referenz dazu ist noch Comeau. Mit dessen online-Compiler kann man sowas
auch mal testen, ohne den gleich zu kaufen.
Siehe http://www.comeaucomputing.com/tryitout/
Und der sagt dann im C-Modus auch prompt:
1
"ComeauTest.c", line 10: error: a void function may not return a value
2
return Aufruf(&a, &x);
3
^
4
5
1 error detected in the compilation of "ComeauTest.c".
thorstendb schrieb:> Dass man einen (void *) zurückgibt, macht Sinn, das ist tatsächlich ein> pointer, vgl. malloc). Aber wozu sollte man einen (void) zurückgeben?
Das würde in C tatsächlich nichts bringen. In C++ wurde das erlaubt, vor
allem für Templates. Da ist es geschickt, wenn man void nicht als
Sonderfall behandeln muß, sondern einfach den Rückgabewert einer
Funktion weiterreichen kann, selbst wenn der void ist.
thorstendb schrieb:> return((void) 42)
Sowas mache ich doch gar nicht!?
6to4 schrieb:> Das hier hingegen:>> thorstendb schrieb:>> return(status);>> Macht jedoch nie Sinn und zeugt nur von einem mangelhaften> Sprachverständniss, obwohl oft gesehen...
Verstehe nicht, wo da der Fehler liegen sollte...
> zeugt nur von einem mangelhaften Sprachverständniss
nope, hier handelt es sich nicht um "mangelhaftes Sprachverständniss",
sondern nur darum, dass ich es schöner lesbar finde, und damit sicher
nicht der einzige bin.
> thorstendb schrieb:> > return((void) 42)> Sowas mache ich doch gar nicht!?
...war nur ein Test der Möglichkeiten.
Nachtrag:
> zeugt nur von einem mangelhaften Sprachverständniss
Ich finde es echt krass, wie schnell man hier niedergemacht wird...
Peter R. schrieb:>> Macht jedoch nie Sinn und zeugt nur von einem mangelhaften>> Sprachverständniss, obwohl oft gesehen...>> Verstehe nicht, wo da der Fehler liegen sollte...
Das hier: ()
ist der Operator für Funktionsaufrufe. Außerdem werden runde Klammern
für arithmetische Ausdrücke verwendet, wie in der Mathematik:
(a + 3 ) / 2
Und zuguterletzt werden die Klammern auch für Kontrollausdrücke
verwendet, wie bei if() und switch().
Bei "return status;" wird weder eine Funktion aufgerufen noch ein
arithmetischer Ausdruck geklammert noch sonstwas. Wo Klammern keinen
Sinn haben, darf man sie ruhig guten Gewissens nicht verwenden :-)
Mark Brandis schrieb:> Peter R. schrieb:>>> Macht jedoch nie Sinn und zeugt nur von einem mangelhaften>>> Sprachverständniss, obwohl oft gesehen...
Also nur noch mal zur Klarstellung:
Das habe ich nicht gesagt!
Mark Brandis schrieb:> Wo Klammern keinen> Sinn haben, darf man sie ruhig guten Gewissens nicht verwenden :-)
Aber schaden tun sie doch auch nicht wirklich...
Wenn es also für ihn übersichtlicher ist, spricht IMHO nichts dagegen.
Peter R. schrieb:>> Wo Klammern keinen>> Sinn haben, darf man sie ruhig guten Gewissens nicht verwenden :-)> Aber schaden tun sie doch auch nicht wirklich...> Wenn es also für ihn übersichtlicher ist, spricht IMHO nichts dagegen.
Du wolltest Kritik und dann kannst du dir hier in diesem Forum sicher
sein, dass du sie bekommst. ;-)
Ich würde die Klammern selbst auch nur dann hinter ein return setzen,
wenn es nötig ist. Es ist aber zu bezweifeln, dass jemand anfängt nach
der Funktion return() zu suchen und selbst wenn, dann sollte er das
C-Buch nochmal von vorne beginnen. ;-)
teto schrieb:> Du wolltest Kritik und dann kannst du dir hier in diesem Forum sicher> sein, dass du sie bekommst.
Ich wollte keine Kritik, außer konstruktive.
teto schrieb:> Es ist aber zu bezweifeln, dass jemand anfängt nach> der Funktion return() zu suchen und selbst wenn, dann sollte er das> C-Buch nochmal von vorne beginnen.
Selbt ich hätte nicht nach einer Funktion return gesucht. Und das hat
was zu bedeuten! ;)
Karl Heinz Buchegger schrieb:> Schaden nicht. Sie bringen aber auch nichts.
Richtig. Dennoch finde ich es mehr als übertrieben gleich von
"mangelhaften Sprachverständniss" zu sprechen!
Peter R. schrieb:> @Remote One:>> Dein Link verweist auf das C#-Programmierhandbuch.
Mir ging es auch eher um diesen Abschnitt:
"Methoden können dem Aufrufer einen Wert zurückgeben. Wenn der
Rückgabetyp (der vor dem Methodennamen angezeigte Typ) nicht void ist,
kann die Methode den Wert mithilfe des return-Schlüsselworts
zurückgeben. Durch eine Anweisung, die aus dem return-Schlüsselwort und
einem Wert besteht, der mit dem Rückgabetyp übereinstimmt, wird der Wert
an den Methodenaufrufer zurückgegeben. Das return-Schlüsselwort beendet
außerdem die Ausführung der Methode. Wenn der Rückgabetyp void ist,
können Sie mit einer return-Anweisung ohne Wert die Ausführung der
Methode beenden. !
Peter R. schrieb:> teto schrieb:>> Es ist aber zu bezweifeln, dass jemand anfängt nach>> der Funktion return() zu suchen und selbst wenn, dann sollte er das>> C-Buch nochmal von vorne beginnen.>> Selbt ich hätte nicht nach einer Funktion return gesucht. Und das hat> was zu bedeuten! ;)
Umgekehrt kann es aber sein, daß jemand nach return-Anweisungen in einer
Funktion sucht und auf den ersten Blick eine übersieht, weil er sie beim
Überfliegen aufgrund der Klammern als Funktionsaufruf fehlinterpretiert.
Erst beim zweiten Hinsehen merkt er dann, daß es gar kein
Funktionsaufruf ist, sondern ein als solcher getarntes return.
Man könnte sich zur Verwirrung auch den Spaß machen, eine Funktion
retrun zu schreiben, die am Ende jeder Funktion aufgerufen wird ;-)
remote1 schrieb:>> Dein Link verweist auf das C#-Programmierhandbuch.>> Mir ging es auch eher um diesen Abschnitt:
Der ist aber für C nicht relevant.
> "Methoden
... gibt es in C nicht.
Ich könnte auch aus der C++-Norm die Passage zitieren, die zeigt, daß es
durchaus erlaubt ist, das "Ergebnis" einer void zurückliefernden
Funktion selbst per return weiterzuleiten. Ist aber für C genausowenig
relevant.
Rolf Magnus schrieb:> Man könnte sich zur Verwirrung auch den Spaß machen, eine Funktion> retrun zu schreiben, die am Ende jeder Funktion aufgerufen wird ;-)
Bring mich nicht auf dumme Gedanken! Wie erwartet gehts leider nicht:
> error: syntax error before "return"
Oder ist der Tippfehler (retRun) Absicht?
Aber wenn man jemanden (besonders Anfänger!) ärgern will:
Opfer arbeitet an einem "hochkomplexen" Projekt (stark gekürzt ;-)):
1
#include<stdio.h>
2
#include<stdlib.h>
3
#include<windows.h>
4
5
intfoo(void);
6
voidbar(void);
7
voidblub(void);
8
9
intmain(void)
10
{
11
inti=foo();
12
bar();
13
blub();
14
return0;
15
}
16
17
intfoo(void)
18
{
19
printf("foo\n");
20
return1;
21
}
22
23
voidbar(void)
24
{
25
printf("bar\n");
26
return;
27
}
28
29
voidblub(void)
30
{
31
printf("blub blub\n");
32
}
Alles prima.
Jetzt folgende Zeile gut verstecken (in irgendeinem Header z.B.)
> #define return Sleep(1000); return
und plötzlich ist das Programm seeeeehr langsam...
SCNR
meckermensch schrieb:> Rolf Magnus schrieb:>> Man könnte sich zur Verwirrung auch den Spaß machen, eine Funktion>> retrun zu schreiben, die am Ende jeder Funktion aufgerufen wird ;-)> Bring mich nicht auf dumme Gedanken! Wie erwartet gehts leider nicht:>> error: syntax error before "return"> Oder ist der Tippfehler (retRun) Absicht?
Ja, der ist Absicht. Es sollte nur ein Funktionsname sein, der dem
"return" möglichst ähnlich sieht.