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


von Franz (Gast)


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:
1
uint8_t Stop (uint8_t Nr)
2
{
3
   uint16_t value;
4
   value = ARRAY[Nr];
5
   return value == 0;   // Was bewirkt diese Zeile ?????
6
}

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

Franz

von MeinerEiner (Gast)


Lesenswert?

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

von Sven P. (Gast)


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:
1
/* ... */
2
if (value == 0) {
3
  return 1;
4
}
5
else {
6
  return 0;
7
}

von Phantomix X. (phantomix)


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

von Karl H. (kbuchegg)


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.

von Phantomix X. (phantomix)


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

von (prx) A. K. (prx)


Lesenswert?

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

von Phantomix X. (phantomix)


Lesenswert?

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

von Karl H. (kbuchegg)


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.

von Andreas K. (derandi)


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.

von Sven P. (Gast)


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.

von Phantomix X. (phantomix)


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 ;-)

von Phantomix X. (phantomix)


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 :-)

von Karl H. (kbuchegg)


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

von Sven P. (Gast)


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

von Praktiker (Gast)


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) { ... }

von MeinerEiner (Gast)


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.

von Stefan E. (sternst)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.