www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage zum initialen Rückgabewert von Funktionen in ANSI-C


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Zapzarapp (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo,

ich habe hier mal eine Frage bezüglich von Funktionsrückgabewerten in C.

Bei Variablen ist ja eigentlich alles klar.

Wenn ich eine Variable deklariere, ihr aber keinen Wert zuweise kann die 
Variable einen zufälligen Wert annehmen (evtl. Compilerabhängig ???)

Wenn ich eine Funktion schreibe, die einen INT Rückgabewert liefert, 
diese jedoch bis zum Zeitpunkt X noch nicht aufgerufen habe, und dann 
das ganze gleich in der if-Abfrage verwende, nach dem Motto,

if(Funktion())
{
   Anweisungen;
}

was passiert dann ?

Also konkret: Hat eine Funktion mit Rückgabewert implizit vor dem Aufruf 
einen definierten Rückgabewert wie z.B. Null, oder kann der Rückgabewert 
auch zufällig sein ?

Danke für eure Antworten

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Deine Frage macht keinen Sinn. Normale Variablen innerhalb von 
Funktionen werden aber als Stackvariablen gefuehrt. Ohne dass die 
Funktion gerufen wird, wird auch das Stackframe nicht angelegt und somit 
gibt es keinen definierten Zustand. Das spielt aber auch kaum eine 
Rolle, daher versteh ich Deine Frage nicht...

Nachtrag: Deine if-Anweisung wird nicht evaluiert bevor Deine Funktion 
nicht vollstaendig abgearbeitet wurde. Das heisst es spielt keine Rolle 
was zu einem Zeitpunkt davor geschehen ist, der Koerper wird erst 
betreten, nachdem alles evaluiert wurde (was auch evaluiert werden 
muss).

Bei

if (0 && Funktion())
{
}

wird Deine Funktion z.B. nicht gerufen werden ;)

Greets,
Michael

Autor: Frank K. (fchk)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Zapzarapp schrieb:

> if(Funktion())
> {
>    Anweisungen;
> }
>
> was passiert dann ?

Du rufst die Funktion ja in der if-Klausel auf. Du könntest genauso 
schreiben:

_temp=Funktion();
if (_temp)
{
...
}

> Also konkret: Hat eine Funktion mit Rückgabewert implizit vor dem Aufruf
> einen definierten Rückgabewert wie z.B. Null, oder kann der Rückgabewert
> auch zufällig sein ?

Bevor eine Funktion nicht aufgerufen wird, liefert sie nichts zurück. 
Wenn die Funktion aufgerufen wird, gibt sie mit return() einen Wert 
zurück. Fehlt das return() in einer nicht als void definierten Funktion, 
gibts zur Compilezeit einen Error.

fchk

Autor: Zapzarapp (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo,

in meiner if-Abfrage rufe ich die Funktion zum ersten mal auf. Sollte 
nun innerhalb der Funktion eine Variable existieren, die zu diesem 
Zeitpunkt nicht sinnvoll belegt ist, (weil evtl. nicht explizit 
vorbelegt) würde die if-Abfrage also erst gar nicht aufgerufen werden ?

Autor: Erich (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Deine Frage macht immer noch keinen Sinn.

Du solltest einen C Programmier Grundkurs belegen.

Autor: Frank K. (fchk)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Zapzarapp schrieb:
> Hallo,
>
> in meiner if-Abfrage rufe ich die Funktion zum ersten mal auf. Sollte
> nun innerhalb der Funktion eine Variable existieren, die zu diesem
> Zeitpunkt nicht sinnvoll belegt ist, (weil evtl. nicht explizit
> vorbelegt) würde die if-Abfrage also erst gar nicht aufgerufen werden ?

Doch klar. Der Aufruf findet in jedem Fall statt. Nur das Ergebnis wäre 
dann eventuell undefiniert.

fchk

Autor: Peter Dannegger (peda)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Zapzarapp schrieb:
> Sollte
> nun innerhalb der Funktion eine Variable existieren, die zu diesem
> Zeitpunkt nicht sinnvoll belegt ist, (weil evtl. nicht explizit
> vorbelegt) würde die if-Abfrage also erst gar nicht aufgerufen werden ?

Sobald Du ein if hinschreibst, wird es auch ausgeführt.
Was die Funktion macht, ist völlig schnurz. Benutzt sie eine lokale 
Variable, ohne sie zu initialisieren, bekommst Du eine Compilerwarnung. 
Wer Warnungen ignoriert, ist selbst schuld.

Das if wird nur dann nicht ausgeführt, wenn der Compiler feststellt, daß 
es immer wahr oder immer falsch ist.


Peter

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Zapzarapp schrieb:
> Hat eine Funktion mit Rückgabewert implizit vor dem Aufruf
> einen definierten Rückgabewert wie z.B. Null, oder kann der Rückgabewert
> auch zufällig sein ?

Er kann nicht nur, sondern er ist (mehr oder weniger) zufällig.
Funktionsrückgabewerte werden üblicherweise in einem (oder mehreren)
Registern zurückgegeben, und diese Register werden auch im Ablauf
der Funktion selbst für Zwischenergebnisse benutzt.

Autor: Karl Heinz Buchegger (kbuchegg) (Moderator)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Zapzarapp schrieb:
> Hallo,
>
> in meiner if-Abfrage rufe ich die Funktion zum ersten mal auf. Sollte
> nun innerhalb der Funktion eine Variable existieren, die zu diesem
> Zeitpunkt nicht sinnvoll belegt ist, (weil evtl. nicht explizit
> vorbelegt) würde die if-Abfrage also erst gar nicht aufgerufen werden ?

Du versuchst hier einen Zusammenhang herzustellen, der nicht existiert.
Es ist eine Sache, was die Funktion zurückliefert. Es ist aber eine 
andere Sache, was der Aufrufer der Funktion mit diesem Wert macht.

Der Rückgabewert ist das verbindende Glied zwischen den beiden. Das if 
interessiert sich nicht dafür, wie die Funktion ihren Rückgabewert 
ermittelt, es benutzt einfach nur diese Wert um die Entscheidung zu 
treffen.
Die Funktion hingegen interessiert sich nicht daür, was mit dem Wert 
passiert, den sie zurückgibt. Sie gibt einfach einen Wert zurück. Wenn 
dieser Wert sich aus (zu diesem Zeitpunkt) undefinierten Werten 
zusammensetzt, dann ist das eben ein zufälliger Wert.

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




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 erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net