ODER operator"||" in verkürzter form anwenden



  • die Klammer hab ich ausversehen vergessen, aber ok.
    Nein, schon kapiert,
    Ich wollte einfach nicht so dumm sein und doppelt so viel wie nötig schreiben.



  • Du musst wahrscheinlich auch nicht so viel schreiben, wie du denkst - nur ist die Lösung eine andere.
    Wenn ich raten sollte, bist du gerade dabei, eine ganze Reihe von gigantischen if-Bedingungen zu konstruieren, das sehe ich öfters.
    Die Lösung sind meist Arrays, aber um genaueres sagen zu können, müsstest du etwas Code zeigen.



  • aber wenn ich jetzt prüfen will, ob z.B. a einen von d,e oder f entspricht,
    muss ich da gleich

    if((a==d)or(a==e)or(a==f))
    schreiben?

    P.S.: Ja, stimmt, ich mach nen haufen if bedingungen für Sudoku.



  • Was du allerdings machen könntest, ist Folgendes:
    wenn du eine bestimmte längere Überprüfung in deinem Code häufiger verwenden möchtest (musst), dann kannst du eine inline bool-Funktion basteln, die den Vergleich macht und dir das Ergebnis zurückgibt. Als Übergabeparameter übergibst du die zu überprüfenden Variablen. So etwas dürfte sellten vorkommen, aber trotzdem:

    ...
        if (check(a, b, c))
            //do smth.
    ...
    
    inline bool check(int a, int b, int c)
    {
        if ((a > 0 && a != b && a != c) || a+b <= 1)
            return true;
        else
            return false;
    }
    


  • und wozu muss da inline rein ...?
    sorry, bin noch nich so erfahren...
    ist inline nicht für eine schnellere ausführung der funktion?



  • [Rewind] schrieb:

    inline bool check(int a, int b, int c)
    {
        if ((a > 0 && a != b && a != c) || a+b <= 1)
            return true;
        else
            return false;
    }
    

    Warum nicht

    return a > 0 && a != b && a != c || a + b <= 1;
    

    ?


  • Mod

    Hacker schrieb:

    und wozu muss da inline rein ...?

    Muss nicht. Das ist ein optionaler Hinweis für Compiler, der heutzutage aber mehr oder weniger ignoriert wird*.

    ist inline nicht für eine schnellere ausführung der funktion?

    Möchtest du es denn nicht schnell haben?

    *: Inline hat noch eine andere Funktion, aber die spielt hier keine Rolle.



  • @Bashar: wie auch immer. Das war nicht der Kernpunkt meines Vorschlags.



  • [Rewind] schrieb:

    @Bashar: wie auch immer. Das war nicht der Kernpunkt meines Vorschlags.

    Der Code ist aber unnötig umständlich, daher halte ich einen Hinweis durchaus für angebracht. An der Semantik ändert sich ja nichts, die ist auch nicht kritisiert worden.

    Hacker schrieb:

    und wozu muss da inline rein ...?

    Ich würds weglassen, das brauchst du eigentlich nicht. Es sei denn, du willst Funktionen im Header definieren.



  • Hallo Hacker,

    den Hinweis von Athar bzgl. Arrays solltest du Ernst nehmen, ansonsten programmierst du dir nämlich einen Wolf... (s. z.B. http://www.c-plusplus.net/forum/232907)

    Wenn du nicht weißt, wie man bei Sudoku vernünftig Arrays einsetzt, dann such einfach mal in diesem Sub-Forum nach "Sudoku".



  • Nexus schrieb:

    Der Code ist aber unnötig umständlich, daher halte ich einen Hinweis durchaus für angebracht.

    Den Code kann doch unmöglich als unnötig umständlich bezeichnen. Für einen Unerfahrenen ist es dadurch sogar leichter/schneller zu erkennen, was der Code macht. Daher ist das in diesem konkreten Fall belanglos.



  • Der Code ist höchstens einfacher zu erkennen, solange man boolsche Ausdrücke noch nicht versteht. Von der Logik her macht man einen unnötigen Schritt. Statt "gib x zurück" hast du "wenn x true ist, gib true zurück, andernfalls gib false zurück".

    Du schreibst ja auch nicht

    bool b = a > 0 && a != b && a != c || a + b <= 1;
    if (b)
        return true;
    else
        return false;
    

    Warum sollte das also anders sein, wenn du b direkt einsetzt?

    Das andere, was oft unnötig umständlich gelöst wird, ist if (b == true) . Aber so konsistent zu sein und if ((y > 3) == true) zu schreiben, tut merkwürdigerweise niemand.

    Daher finde ich es wichtig, dass man gerade Anfängern zeigt, wie sie ihren Code vereinfachen können, ohne dass er weniger übersichtlich ist. Schlussendlich können sie immer noch selbst entscheiden, wie sie ihren Code formulieren, aber wenigstens kennen sie mehrere Möglichkeiten und nicht nur die umständliche.



  • C++0x:

    template<typename Type> bool is_one_of(Type elem, Type first_comp_value, Type... other_comp_values);
    
    template<typename Type> bool is_one_of(Type elem, Type last_comp_value)
    {
        return elem == last_element;
    }
    
    template<typename Type> bool is_one_of(Type elem, Type first_comp_value, Type... other_comp_values)
    {
        return (elem == first_comp_value) || is_one_of(elem, other_comp_values...);
    }
    

Anmelden zum Antworten