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.


  • 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