Merkwürdiges Problem mit Schleife...



  • pointercrash() schrieb:

    while((antwort != 'j') || (antwort != 'J') || (antwort != 'n') || (antwort != 'N'))
    

    Probier's mal so.

    Eher so:

    while((antwort != 'j') && (antwort != 'J') && (antwort != 'n') && (antwort != 'N'))
    


  • bei sowas hilft es, einfach mal ein Beispiel durchzugehen

    angenommen, der User gibt 'j' ein

    'j' != 'j' == FALSE
    'j' != 'J' == TRUE
    'j' != 'n' == TRUE
    'j' != 'N' == TRUE
    
    FALSE || TRUE || TRUE || TRUE == TRUE
    

    Das Ergebnis ist immer TRUE

    die zusätzlichen Klammern sind nicht notwendig



  • _matze schrieb:

    Eher so:

    while((antwort != 'j') && (antwort != 'J') && (antwort != 'n') && (antwort != 'N'))
    

    Upps, ja. Eins fehlt noch, um sicherzustellen, daß er nicht gleich rausfliegt:

    int antwort = 0;
    

    Hamma's? 😃



  • pointercrash() schrieb:

    Upps, ja. Eins fehlt noch:

    int antwort = 0;
    

    Hamma's? 😃

    Richtig, aber wie wär's mit

    char antwort=0;
    

    ?



  • Herzlichen Dank für eure Hilfe, irgendwie hab ich den Kopf heute nicht so bei der Sache, eigentlich hätte ich merken sollen was zwutz aufgeschrieben hat:

    zwutz schrieb:

    bei sowas hilft es, einfach mal ein Beispiel durchzugehen

    angenommen, der User gibt 'j' ein

    'j' != 'j' == FALSE
    'j' != 'J' == TRUE
    'j' != 'n' == TRUE
    'j' != 'N' == TRUE
    
    FALSE || TRUE || TRUE || TRUE == TRUE
    

    Das Ergebnis ist immer TRUE

    die zusätzlichen Klammern sind nicht notwendig

    @zwutz: Danke diesen Tipp werd ich mir merken! 🙂 👍

    Wünsche allen einen schönen Tag und ev. schon guten Appetit 😃
    mfg PapaNoah



  • PapaNoah schrieb:

    Wünsche allen einen schönen Tag und ev. schon guten Appetit 😃

    Gleichfalls! 😉



  • pointercrash() schrieb:

    _matze schrieb:

    Eher so:

    while((antwort != 'j') && (antwort != 'J') && (antwort != 'n') && (antwort != 'N'))
    

    Upps, ja. Eins fehlt noch, um sicherzustellen, daß er nicht gleich rausfliegt:

    int antwort = 0;
    

    Hamma's? 😃

    Wäre da eine Fußgesteuerte Schleife nicht ohnehin sinnvoller, da logischer !?!



  • Ja, definitiv...



  • Korhil schrieb:

    pointercrash() schrieb:

    _matze schrieb:

    Eher so:

    while((antwort != 'j') && (antwort != 'J') && (antwort != 'n') && (antwort != 'N'))
    

    Upps, ja. Eins fehlt noch, um sicherzustellen, daß er nicht gleich rausfliegt:

    int antwort = 0;
    

    Hamma's? 😃

    Wäre da eine Fußgesteuerte Schleife nicht ohnehin sinnvoller, da logischer !?!

    Bereits erledigt, wurde eben gerade persönlich darauf hingewiesen ^^



  • Die inneren Klammern sollten nicht nötig sein, weil != schwächer bindet als ||.
    (In C99 steht auch irgendwo in den Headern #define and &&, ist manchmal übersichtlicher)
    Es sollte also auch so gültig sein:

    while (antwort != 'j' and antwort != 'J' and antwort != 'n' and antwort != 'N')
        /* ... */;
    

    Für viele Zeichen könnte man auch eine Vergleichsfunktions verwenden:

    while (!memchr("jJnN", antwort, 4))
        /* ... */;
    

    EDIT:
    #define schächer stärker



  • bgdnoy schrieb:

    Die inneren Klammern sollten nicht nötig sein, weil != schwächer bindet als ||.

    Ja, alles richtig, aber es gibt dann doch ein paar Gründe, das als erstes zu machen. Bei anderen Sprachen ist da gelegentlich umgestellt.
    Hauptsächlich mache ich das aus optischen Gründen, wenn ich mir nicht zu 100% sicher bin, Klammerung funktioniert in allen Sprachen, die das vorsehen.
    Daß ich den Test im Geiste nicht durchgegangen bin, mea culpa.


Anmelden zum Antworten