mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Was bewirkt return value == 0; in einer Funktion


Autor: Franz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,

ich bin dabei mich etwas einzuarbeiten und bin schon über die üblichen 
Blinkprogramme hinaus.
Ich kenne natürlich Funktionen und habe auch schon damit gearbeitet und 
das ich mit einem return einen Wert zurückgeben kann nun habe ich eine 
Funktion hier im Forum entdeckt bei der ich das return nicht verstehe 
vermutlich wieder eine kurzschreibweise oder so.
Hier mal der Quelltext:
uint8_t Stop (uint8_t Nr)
{
   uint16_t value;
   value = ARRAY[Nr];
   return value == 0;   // Was bewirkt diese Zeile ?????
}

Wäre nett wenn es jemand erklären könnte.

Franz

Autor: MeinerEiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich vermut mal, wenn value = 0 ist, wird true zurückgegeben, ansonsten 
false.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sie verlässt die Funktion 'Stop' und hinterlässt als Rückgabewert das 
Ergebnis des Ausdrucks 'value == 0'. Man könnte quasi auch schreiben:
/* ... */
if (value == 0) {
  return 1;
}
else {
  return 0;
}


Autor: Phantomix Ximotnahp (phantomix) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nicht ganz. "false" ist definiert als 0. "true" ist definiert als "Wert 
!= 0"
Also kann der Compiler da beliebig optimieren. Ich würd sagen, es ist 
wahrscheinlicher dass "value" zurückgegeben wird, nicht 1. Aber 
verlassen kann man sich darauf wie gesagt nicht

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

Bewertung
0 lesenswert
nicht lesenswert
Phantomix Ximotnahp schrieb:
> Nicht ganz. "false" ist definiert als 0. "true" ist definiert als "Wert
> != 0"

Fast.
Es ist richtig, dass jeder Wert ungleich 0 als true angesehen wird.
Allerdings ist auch definiert, dass  das Ergebnis "true" eines 
Vergleiches als 1 dargestellt wird. Der Compiler kann also nicht einfach 
irgendeinen Wert bei != aus dem Ärmel schütteln, sondern es muss 
tatsächlich 1 sein wenn das Ergebnis true lautet.

Autor: Phantomix Ximotnahp (phantomix) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Theoretisch müsst ich jetzt mein C-Buch rauskramen, wenn ich eins zur 
Hand hätte ;-)
Also im 1. Semester Informatik haben wir das so gelernt, dass true ein 
Wert != 0 ist. Ob das nun immer 1 ist kann ich grad nicht bestätigen / 
verneinen, verlassen tu ich mich jedenfalls nicht darauf.

http://info.baeumle.com/c04.html
Punkt "Logische und Vergleichsoperatoren"
> Für C ist jeder numerische Wert ungleich 0 gleichwertig
> mit TRUE (wahr), nur die 0 wird als FALSE (falsch)
> interpretiert. Dementsprechend gibt es auch logische
> Operatoren, die als Ergebnisse die Werte 0 oder
> "ungleich 0", meistens konkret den Wert 1, zurückliefern.

Der Satz bestätigt aber eher meine Aussage. Vielleicht ist die "1" 
GCC-typisch

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Logische Operatoren und Vergleiche in C/C++ geben für "true" definitiv 
immer 1 zurück. Egal welcher Compiler das ist.

Autor: Phantomix Ximotnahp (phantomix) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na schön dann glaube ich das so mal. Danke für das Stopfen einer 
Wissenlücke :-)

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

Bewertung
0 lesenswert
nicht lesenswert
Phantomix Ximotnahp schrieb:
> Na schön dann glaube ich das so mal.

Entscheidend ist an dieser Stelle nicht, was in irgendeinem obskuren 
Buch steht (du glaubst gar nicht wieviele Fehler in den 
Nicht-Mainstream-Büchern enthalten sind). Entscheidend ist, was die 
genormte Sprachdefinition (der sog. 'Standard') fordert. Und dort ist 
das so festgelegt.

> Dementsprechend gibt es auch logische
> Operatoren, die als Ergebnisse die Werte 0 oder
> "ungleich 0", meistens konkret den Wert 1, zurückliefern.

Nicht 'meistens'. Er muss 1 liefern! Ansonsten ist der Compiler 
nicht-standardkonform. Und da es sich hier um etwas sehr Banales 
handelt, kannst du beruhigt davon ausgehen, dass alle Compiler das 
richtig machen. Eine Nicht-Konformität an dieser Stelle würde bei einem 
kommerziellen Compiler innerhalb 2 Wochen nach Verkaufsstart auffallen, 
wenn es nicht schon die Testsuiten in der Entwicklungsabteilung 
feststellen würden, was sehr wahrscheinlich ist. Eine derartige 
Nichtkonformität würde als sofortiger 'Showstopper' klassifiziert 
werden.

Autor: Andreas K. (derandi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was anderes sollte ihm bei boolschen Werten (die gibts ja 'eigentlich' 
erst ab C++ oder?) ja auch nicht übrig bleiben.
Wäre auch unlogisch wenn er auf die Frage ob "Value ungleich 0" ist mit 
12 oder 45 antwortet.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Phantomix Ximotnahp schrieb:
> http://info.baeumle.com/c04.html
> Punkt "Logische und Vergleichsoperatoren"
>> Für C ist jeder numerische Wert ungleich 0 gleichwertig
>> mit TRUE (wahr), nur die 0 wird als FALSE (falsch)
>> interpretiert. Dementsprechend gibt es auch logische
>> Operatoren, die als Ergebnisse die Werte 0 oder
>> "ungleich 0", meistens konkret den Wert 1, zurückliefern.
>
> Der Satz bestätigt aber eher meine Aussage. Vielleicht ist die "1"
> GCC-typisch

Richteste Professor Doktor von zu auf und davon Baeumle nen freundlichen 
Gruß von uns aus :-)

ISO/IEC 9899:TC2 Committee Draft -- May 6, 2005, Seite 98:
> Each of the operators < (less than), > (greater than), <= (less than
> or equal to), and >= (greater than or equal to) shall yield 1 if the
> specified relation is true and 0 if it is false.90)
> The result has type int.

Fußnote:
>90) The expression a<b<c is not interpreted as in ordinary mathematics.
> As the syntax indicates, it means (a<b)<c; in other words, ``if a is
> less than b, compare 1 to c; otherwise, compare 0 to c''.


'bool' gibt es seit C99 auch in C.

Autor: Phantomix Ximotnahp (phantomix) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Richteste Professor Doktor von zu auf und davon Baeumle
> nen freundlichen Gruß von uns aus :-)

LOL nee den link hatte ich nur ergoogelt... im Studium hatten wir das 
aber auch so

> Was anderes sollte ihm bei boolschen Werten (die gibts ja
> 'eigentlich' erst ab C++ oder?) ja auch nicht übrig bleiben.

Wie wärs mit -1? g

> Wäre auch unlogisch wenn er auf die Frage ob "Value
> ungleich 0" ist mit 12 oder 45 antwortet.

Und was hat ein Computer jetzt mit Logik zu tun ;-) Nee hast schon 
recht, wenns so im Standard steht dann sei es so ;-)

Autor: Phantomix Ximotnahp (phantomix) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe grad mal nachgeschaut

http://flash-gordon.me.uk/ansi.c.txt

> 3.3.8 Relational operators
[...]
> Each of the operators < (less than), > (greater than), <= (less
> than or equal to), and >= (greater than or equal to) shall yield 1 if
> the specified relation is true and 0 if it is false./38/ The result
> has type int.

> 3.3.9 Equality operators
[...]
> The == (equal to) and the != (not equal to) operators are analogous
> to the relational operators except for their lower precedence./39/

Damit ist die Sache amtlich und geklärt :-)

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

Bewertung
0 lesenswert
nicht lesenswert
Phantomix Ximotnahp schrieb:

>> Was anderes sollte ihm bei boolschen Werten (die gibts ja
>> 'eigentlich' erst ab C++ oder?) ja auch nicht übrig bleiben.
>
> Wie wärs mit -1? *g*

Wenn schon, dann die universellste aller Naturkonstanten: 42

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Phantomix Ximotnahp schrieb:
>> Was anderes sollte ihm bei boolschen Werten (die gibts ja
>> 'eigentlich' erst ab C++ oder?) ja auch nicht übrig bleiben.
>
> Wie wärs mit -1? *g*
Ich glaub, das gabs in (Visual) Basic mal

Autor: Praktiker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bleibt nur noch zu erwähnen, dass sowas:

if ((i > 3) == true) { ... }

dennoch nur gecoded werden sollte, wenn man viel übrige Zeit hat.

Besser wäre schon:

if ((i > 3) != false) { ... }

Oder natürlich gleich:

if (i > 3) { ... }

Autor: MeinerEiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> Wie wärs mit -1? *g*
>Ich glaub, das gabs in (Visual) Basic mal

Isses bei Access-Datenbanken mit Ja/Nein-Feld auch heute noch.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Praktiker schrieb:
> Bleibt nur noch zu erwähnen, dass sowas:
>
> if ((i > 3) == true) { ... }
>
> dennoch nur gecoded werden sollte, wenn man viel übrige Zeit hat.

Warum? Auch der <-Operator liefert entweder 0 oder 1 als Ergebnis, und 
nichts anderes. Der entsprechende Auszug aus dem Standard wurde oben 
doch schon gepostet.

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
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
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 bestätigst du, die Nutzungsbedingungen anzuerkennen.