PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : mehrfach Abfrage in C



Siro
15.02.2012, 12:00
Hallo, ein simple Frage:

Ist das ein gültiges "C" Konstrukt ?

if (r1 == r2 == r3 == r4) .....

oder muss ich schreiben:

if ((r1 == r2) && (r2 == r3) && (r3 == r4)) .....

Der Compiler meckert zumindestens nicht und es "scheint" zu funktionieren.


Versuch macht klug, funktioniert nicht immer....

r1 = 1;
r2 = 1;
r3 = 1;
r4 = 1;
funktioniert

r1 = 1;
r2 = 1;
r3 = 1;
r4 = 2;
funktioniert

r1 = 1;
r2 = 1;
r3 = 2;
r4 = 1;
funktioniert

r1 = 2;
r2 = 2;
r3 = 2;
r4 = 2;
funktioniert nicht ??????
hier landet das Programm im Zweig "nicht gleich"

wenn ich mir den Assembler Code ansehe, wundert mich garnichts mehr...

Siro

danimath
15.02.2012, 13:39
Moin,

also das ist eine gültige C-Konstruktion, macht aber nicht das, was Du vorhast. Ich bin mir gerade nicht sicher, ob der Parser von links oder von rechts arbeitet, also angenommen er arbeitet von links, dann ist Deine Abfrage so was wie


if (((r1 == r2) == r3) == r4)

Also erst wird r1 mit r2 verglichen, dann das Ergebnis (true oder false!!!) mit r3 usw. Aus eigener leidvoller Erfahrung empfehle ich: schreib nie in Umgangssprache, sondern so, wie in Deiner zweiten Zeile.

BTW: mehr schönen C-Code gibt's hier (http://www0.us.ioccc.org/years.html) :evil: oder schau in meine Signatur ;)

viele Grüße
Andreas

Siro
15.02.2012, 14:07
Hallo Andreas,
ich glaube ich verstehe was Du meinst. Er liefert mir beim ersten Vergleich ein BOOLEAN also TRUE wenn die Werte gleich sind und führt dann weitere Vergleiche mit dieser 1 durch. Das geht dann natürlich in die Hose.
Aber mal was ganz anderes: Wie kommt es, dass ('/'/'/') tatsächlich 1 ergibt, hab es eben mal ausprobiert ebenso ('-'-'-') Der Compiler macht eine 0 draus.
Wirklich erstaunlich, muss man das Verstehen ?????? ('/') ergbit eine 47 hängt also irgendwie mit dem Ascii-Code zusammen....
Danke Dir für die Info.

Dann ist also ('/') - ('/'/'/') = 46 :cool:

Siro

radbruch
15.02.2012, 14:25
Aber mal was ganz anderes: Wie kommt es, dass ('/'/'/') tatsächlich 1 ergibt, hab es eben mal ausprobiert ebenso ('-'-'-') Der Compiler macht eine 0 draus.Das würde ich auch gerne wissen:

http://www.google.de/search?q=('/'/'/')
http://www.google.de/search?q=('-'-'-')

danimath
15.02.2012, 14:33
Mega-grins:


'/'/'/' ist besser lesbar als
'/' / '/' und das ist das gleiche wie
47 / 47 (weil chars auch nur Zahlen sind), also 1, also true. false ist dann ganz ähnlich (in Mathefachliteratur heißt es immer: "der einfache Beweis sei dem Leser überlassen";)).




Dann ist also ('/') - ('/'/'/') = 46 :cool:

rischtisch



viele Grüße
Andreas

radbruch
15.02.2012, 14:42
und das ist das gleich wieist ja unfassbar einfach. Ich "stolpere" leider gedanklich immer über "(... also 1, also true." und finde deshalb diese einfachen 1/0-Lösungen nicht. Danke.

Gruß

mic

P.S.: Offensichtlich denke ich nicht mehr, ich google...

danimath
15.02.2012, 14:49
Ging mir auch so, bis ein Kollege mir mal erklärt hat: "false, das ist falsch, das ist nix, das ist 0". Seitdem ist es im Hirn festgebrannt. Alles andere ist dann eben "true". Wenn ich mich richtig erinnere ist (oder war) das auch mal die Definition in der Sprache; 0 == false, alles andere ist true)

viele Grüße
Andreas

danimath
15.02.2012, 14:57
Gerade mal ausprobiert:



#include <stdio.h>

int main (void)
{
if (0)
printf ("0\n");
if (1)
printf ("1\n");
if (2)
printf ("2\n");
if (3)
printf ("3\n");
if (3.14)
printf ("3.14\n");
return 0;
}


Ausgabe:


1
2
3
3.14

Edit: schön zu wissen, das 42 true ist :cheesy:

radbruch
15.02.2012, 15:09
Eben, daran bleibe ich immer hängen. True ist nicht 1, nicht PI, nicht r1bis4 oder gar 42, True ist einfach nur !false:

#define false (1==0)
#define true !false

So habe ich das mal irgendwann aufgeschnappt und das gefällt mir ganz gut. :)
https://www.roboternetz.de/community/threads/51152-Gibt-es-den-Datentyt-Boolean-in-C

Gruß

mic

#define true 42

Siro
15.02.2012, 22:56
Hast Du gut erklärt Andreas, sogar ich hab es verstanden. mit der zunächst kryptografischen Schreibweise.
Ich lag also garnicht so verkehrt mit meiner ASCII Vermutung, hatte es aber trotzdem erst nicht verstanden.

Danke und einen schönen Abend
Siro

danimath
16.02.2012, 08:41
Danke für die Blumen :Strahl Es freut mich, dass ich mal was zurück geben konnte.

viele Grüße
Andreas

oberallgeier
16.02.2012, 13:02
... schön zu wissen, das 42 true ist ...Ich dachte immer, es ist seit etwa 1978 bekannt, dass die Antwort 42 (http://de.wikipedia.org/wiki/42_(Antwort)) ist.


Mit einem klitzekleinen, aber boshaften Grinsen.

danimath
16.02.2012, 13:59
Ich dachte immer, es ist seit etwa 1978 bekannt, dass die Antwort 42 (http://de.wikipedia.org/wiki/42_(Antwort)) ist.


Ja - und C sagt, dass die Antwort wahr ist.