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