if und else
-
Verstehe ich nicht, wie soll das funktionieren?
-
So etwa:
#include<iostream> using namespace std; int main() { int a = 0; int b = 0; while (cin >> a >> b ) { if(a < b) { cout << b << " B ist groesser A " << a << '\n'; } else if(a > b) { cout << a << " A ist groesser B " << b << '\n'; } else { cout << a << " A ist gleich B " << b << '\n'; } } //-- Halt Routine -- getchar(); return 0; }
Und ich würde den Code auch etwas schöner einrücken.
Und unbedingt für den while-block Klammern verwenden, ich zumindest finde das so viel übersichtlicher.
-
#include<iostream> using namespace std; int main() { int a =0; int b =0; while (cin>> a >>b ) if( a<b) { cout <<b <<" B ist groesser A "<<a <<'\n'; } else { if(a>b) { cout <<a <<" A ist groesser B "<<b <<'\n'; } else /* if(a==b) */ // Denn welche Möglichkeit gibt es hier sonst noch? { cout <<a <<" A ist gleich B "<<b <<'\n'; } } //-- Halt Routine -- getchar(); return 0; }
-
Na klar Stimmt! Vielen Dank und schönes Wochenende.
-
Und wie schon gezeigt:
else { if(a>b) { cout <<a <<" A ist groesser B "<<b <<'\n'; } else /* if(a==b) */ // Denn welche Möglichkeit gibt es hier sonst noch? { cout <<a <<" A ist gleich B "<<b <<'\n'; } }
Du brauchst keine geschweiften Klammern nach dem else, da ein einzelnes if-else als ein Statement zählt.
else if(a>b) { cout <<a <<" A ist groesser B "<<b <<'\n'; } else /* if(a==b) */ // Denn welche Möglichkeit gibt es hier sonst noch? { cout <<a <<" A ist gleich B "<<b <<'\n'; }
Und dann ist es gängige Praxis, das if direkt hinters else zu schreiben und nicht noch einmal einzurücken, ist einfach kürzer.
else if(a>b) { cout <<a <<" A ist groesser B "<<b <<'\n'; } else /* if(a==b) */ // Denn welche Möglichkeit gibt es hier sonst noch? { cout <<a <<" A ist gleich B "<<b <<'\n'; }
-
cout << a << (a < b ? " A ist kleiner B " : a==b ? " A ist gleich B " : " A ist groesser B ") << b << '\n';
oder
cout << a << " A ist " << (a < b ? "kleiner" : a == b ? "gleich" : "groesser") << " B " << b << '\n';
oder
cout << a << " ist " << (a < b ? "kleiner " : a == b ? "gleich " : "groesser ") << b << '\n';
-
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.