Wie ist es richtig programmiert?

Gast #2082610
Lesenswert?

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
int fputc(int c, FILE *f) {
2
  return(SendChar(c));
3
}
4
[c]
5

6
[c]
7
int func(int a) {
8
  int status=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.
Gast #2082701
Lesenswert?

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.

> }
Gast #2082708
Lesenswert?

@all:

Das void kein Rückgabewert hat ist mir bekannt. Demnach sollte 
theoretisch auch das erlaubt sein:
1
void Test(int a, char b)
2
{
3
  char x;
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.
Gast #2082724
Lesenswert?

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**
1
void func2() {
2
  return((void) 42);
3
}
4

5
void func(void) {
6
  return(func2());
7
}
Gast #2082729
Lesenswert?

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;
Gast #2082732
Lesenswert?

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
Gast #2082738
Lesenswert?

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.
Gast #2082748
Lesenswert?

> 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.
Gast #2082750
Lesenswert?

> 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...
#2083271
Lesenswert?

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 :-)
Gast #2083921
Lesenswert?

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.
Gast #2083926
Lesenswert?

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. ;-)
Gast #2085403
Lesenswert?

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!
Gast #2085408
Lesenswert?

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. !
Gast #2085451
Lesenswert?

Und der Vollständigkeit wegen - das sagt der ANSI Standard:
1
3.6.6.4 The return statement
2

3
Constraints
4

5
   A return statement with an expression shall not appear in a
6
function whose return type is void .
Gast #2085519
Lesenswert?

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.
Gast #2085536
Lesenswert?

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
int foo(void);
6
void bar(void);
7
void blub(void);
8

9
int main(void)
10
{
11
  int i=foo();
12
  bar();
13
  blub();
14
  return 0;
15
}
16

17
int foo(void)
18
{
19
  printf("foo\n");
20
  return 1;
21
}
22

23
void bar(void)
24
{
25
  printf("bar\n");
26
  return;
27
}
28

29
void blub(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
Gast #2085542
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren