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.
-
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.
-
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.
-
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.