if und else



  • EOP schrieb:

    cout<<a<<" A ist "<<(a>=b)*8+"kleiner\0gleich\0groesser"+(a>b)*7<<" B "<<b<<'\n';
    

    edit: hatte " A ist " falsch eingefügt.



  • volkard schrieb:

    EOP schrieb:

    cout<<a<<(a>=b)*8+" A ist "<<"kleiner\0gleich\0groesser"+(a>b)*7<<" B "<<b<<'\n';
    

    ROFL.



  • Falls es funktionieren sollte - was macht das '+'? Kenn ich so nicht.


  • Mod

    EOP schrieb:

    Falls es funktionieren sollte - was macht das '+'? Kenn ich so nicht.

    Pointeraddition. Ein Zeichenkettenliteral ist schließlich ein char-Array und zerfällt in fast jedem Kontext (so auch hier) in einen Pointer auf sein erstes Element:
    "abc" + 1 : Zeiger auf das 'b'.
    1 + "abc" : So herum geht das natürlich auch.
    1 + "abc" + 1 : Zusammen ergibt das einen Zeiger auf das 'c'

    PS: Beachte auch volkards nachträgliche Änderung. Der von dir zitierte Code macht nämlich nicht viel Sinn.


  • Mod

    volkard schrieb:

    EOP schrieb:

    cout<<a<<" A ist "<<(a>=b)*8+"kleiner\0gleich\0groesser"+(a>b)*7<<" B "<<b<<'\n';
    

    edit: hatte " A ist " falsch eingefügt.

    Würde ein Compiler eine multiway-branch nicht genau so optimieren? (Bin gerade zu faul den Assembler zu vergleichen).



  • Sieht extrem cool aus, muss das untersuchen wenn mein Besuch wieder weg ist.

    Danke für die Erklärungen, wusste nicht daß das so in C++ funktioniert.
    Man lernt immer dazu. Wenn man nur will.


  • Mod

    EOP schrieb:

    Sieht extrem cool aus, muss das untersuchen wenn mein Besuch wieder weg ist.

    Danke für die Erklärungen, wusste nicht daß das so in C++ funktioniert.
    Man lernt immer dazu. Wenn man nur will.

    Weitere beliebte Tricks dieser Art:

    "abc"[1]; // Das 'b'
    1["abc"]; // Ebenfalls das 'b'
    

    Gerade letzteres ist gut, um Leuten ein Aha-Erlebnis zu verpassen, dass der Operator[]
    1. Effektiv zwei Seiten hat
    2. Dazu auch noch assoziativ ist
    (zumindest im Falle von Pointern und Ganzzahlen)



  • SeppJ schrieb:

    EOP schrieb:

    Sieht extrem cool aus, muss das untersuchen wenn mein Besuch wieder weg ist.

    Danke für die Erklärungen, wusste nicht daß das so in C++ funktioniert.
    Man lernt immer dazu. Wenn man nur will.

    Weitere beliebte Tricks dieser Art:

    "abc"[1]; // Das 'b'
    1["abc"]; // Ebenfalls das 'b'
    

    Gerade letzteres ist gut, um Leuten ein Aha-Erlebnis zu verpassen, dass der Operator[]
    1. Effektiv zwei Seiten hat
    2. Dazu auch noch assoziativ ist
    (zumindest im Falle von Pointern und Ganzzahlen)

    Na so doof bin ich nun auch wieder nicht. Programmiere C seit Ende der 80er.
    Nur das mit dem '+' war mir neu.

    EDIT:
    oder ich hab es vergessen. die ganze Programmiergeschichte ist für mich inzwischen nur noch eim Hobby. Hab mich aus dem Arbeitsprozess vor vier Jahren ausgeklinkt.



  • Jo, mit jenem Trick und einer LUT siehts auch nicht hübsch aus.

    cout << a << " A ist " << &"\17\10" [(a<=b)+(a<b)] ["kleiner\0gleich\0groesser"] << " B " << b << '\n';
    

    Was ich eigentlich ausdrücken wollte, war, daß ich EOPs ?:-Lösung für unleserlich halte im Vergleich zur if-else-Lösung.



  • volkard schrieb:

    Was ich eigentlich ausdrücken wollte, war, daß ich EOPs ?:-Lösung für unleserlich halte im Vergleich zur if-else-Lösung.

    Ich fand's cool. Jede Menge Leerzeichen und so. Man muss es nur ne Weile auf sich wirken lassen. Und es ist zweifellos recht kompakt.

    EDIT:

    ?:
    

    war schon immer was für freaks, ist aber eigentlich nur ein kompaktes if-else

    Ich hätte ja ein paar Klammern setzen können. Wollte ich aber absichtlich nicht.
    Und wer weiß ob die Leserlichkeit dadurch gesteigert worden wäre.


Anmelden zum Antworten