-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: mehrfach Abfrage in C

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.11.2007
    Ort
    Berlin
    Beiträge
    524

    mehrfach Abfrage in C

    Anzeige

    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
    Geändert von Siro (15.02.2012 um 12:48 Uhr)

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.08.2011
    Ort
    Hannover
    Beiträge
    164
    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

    Code:
    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 oder schau in meine Signatur

    viele Grüße
    Andreas
    #define true ('/'/'/')
    #define false ('-'-'-')

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.11.2007
    Ort
    Berlin
    Beiträge
    524
    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

    Siro
    Geändert von Siro (15.02.2012 um 14:16 Uhr)

  4. #4
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    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=('-'-'-')

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.08.2011
    Ort
    Hannover
    Beiträge
    164
    Mega-grins:

    Code:
    '/'/'/'
    ist besser lesbar als
    Code:
    '/'  /  '/'
    und das ist das gleiche wie
    Code:
    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").


    Zitat Zitat von Siro Beitrag anzeigen
    Dann ist also ('/') - ('/'/'/') = 46
    rischtisch



    viele Grüße
    Andreas
    #define true ('/'/'/')
    #define false ('-'-'-')

  6. #6
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    und das ist das gleich wie
    ist 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...
    Geändert von radbruch (15.02.2012 um 14:48 Uhr)

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.08.2011
    Ort
    Hannover
    Beiträge
    164
    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
    #define true ('/'/'/')
    #define false ('-'-'-')

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.08.2011
    Ort
    Hannover
    Beiträge
    164
    Gerade mal ausprobiert:

    Code:
    #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:

    Code:
    1
    2
    3
    3.14
    Edit: schön zu wissen, das 42 true ist
    #define true ('/'/'/')
    #define false ('-'-'-')

  9. #9
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    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. :)
    http://www.roboternetz.de/community/...t-Boolean-in-C

    Gruß

    mic

    #define true 42

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.11.2007
    Ort
    Berlin
    Beiträge
    524
    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
    Geändert von Siro (16.02.2012 um 02:12 Uhr)

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Mehrfach USB Switch
    Von Basteltisch im Forum Elektronik
    Antworten: 7
    Letzter Beitrag: 22.01.2010, 23:15
  2. Mehrfach initialisieren möglich?
    Von Duesentrieb im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 01.11.2007, 10:31
  3. ICP1 an Mega32 mehrfach benutzen möglich ?
    Von Tommy75 im Forum AVR Hardwarethemen
    Antworten: 0
    Letzter Beitrag: 13.10.2007, 12:57
  4. Timer mehrfach / optimal nutzen
    Von DerRuffi im Forum AVR Hardwarethemen
    Antworten: 6
    Letzter Beitrag: 26.10.2006, 09:16
  5. Versorgungspins mehrfach vorhanden
    Von Amri im Forum AVR Hardwarethemen
    Antworten: 1
    Letzter Beitrag: 01.08.2005, 19:24

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •