Abfrage dreier Argumente



  • Moin.

    Ich hab da sowas auf die Beine gestellt:

    /* --------------------------------------
    	*	int trenner = -1;					*
    	*	if ( strich != -1 )					*
    	*		trenner = strich;				*
    	*	else								*
    	*		trenner = punkt;				*
    	----------------------------------------*/
    

    was ja dem entspricht:

    int trenner = strich != -1 ? strich : punkt;
    

    so jetzt habe ich aber nicht nur 2 die Abgeprüft werden sollen sondern 3
    (strich, Punkt, Hoch)

    also doch irgendwie so (in langform):

    /* --------------------------------------
    	*	int trenner = -1;					*
    	*	if ( srich != -1 )					*
    	*		trenner = strich;				*
    	*	else if ( punkt != -1 )				*
    	*		trenner = punkt;
    	*	else
    	*		trenner = hoch;
    	----------------------------------------*/
    

    Meine Fragen:

    1. ist die 2. Lange Abfrage wo ich nach Punkt, Strich und Hoch gucke so korrekt?
    2. Wie würde das in der kurzfassung aussehen?
    3. Ist das ? in der Kurzform ein else? und warum strich : punkt und nicht strich = punkt?

    Danke

    Ps:
    Entschuldigt fals der Titel des Themas etwas ungenau ist ich wusste nicht wie ich es nennen sollte 🙂

    gruß :xmas1:



  • Meine Antworten:
    1. Ja 🙂

    trenner = (strich != -1) ? strich 
                             : (punkt != -1) ? punkt
                                             : hoch;
    

    3. Nein, ist es nicht. Die ?: - Geschichte nennt sich ternärer Operator und verhält sich wie folgt:
    Der Ausdruck " C ? A : B " hat den Wert des Ausdrucks A, wenn C true ist, sonst hat er den Wert des Ausdrucks B. Das sollte aber auch im Buch/Tutorial deiner Wahl so drinstehen...



  • int trenner = strich != -1 ? strich : (punkt!=-1 ? trenner=punkt : trenner=hoch ) ;
    

    EDIT: Das "?" ist quasi das "then", das in C++ in einem if-Statement nicht ausgeschrieben wird. Der Doppelpunkt ist das else.



  • Virokams schrieb:

    1. ist die 2. Lange Abfrage wo ich nach Punkt, Strich und Hoch gucke so korrekt?

    Vermutlich, ich kenne den umliegenden Code nicht. Davon abgesehen: würde es dir etwas ausmachen die Auskommentierung im Forum um den gesamten Code wegzulassen (Was nützen die C/C++ Tags wenn keine Codehervorhebung verwendet wird?).

    Virokams schrieb:

    2. Wie würde das in der kurzfassung aussehen?

    Schwer lesbar. Lass es einfach. Gerade wenn du darauf keine Antwort weißt, ist dies ein weiteres Indiz dafür das es nicht lesbar ist. Ich verwende die Kurzschreibweise nur bei einfachen ausdrücken.

    Virokams schrieb:

    3. Ist das ? in der Kurzform ein else? und warum strich : punkt und nicht strich = punkt?

    Du kannst es in etwa so sehen:

    <bedingung> ? <argument, true> : <argument, false>

    Also wenn steht hierbei der ":" für das else. Das "?" Trennt die Bedingung von den beiden Fällen.

    Über die Syntaxentscheidungen brauchst du nach über 30 Jahren C und C++ nicht mehr wirklich zu Fragen 😉 (Steht aber soviel ich weiß in einem Buch über die Entstehung und das Design der Sprache).

    cu André



  • _matze schrieb:

    int trenner = strich != -1 ? strich : (punkt!=-1 ? trenner=punkt : trenner=hoch ) ;
    

    EDIT: Das "?" ist quasi das "then", das in C++ in einem if-Statement nicht ausgeschrieben wird. Der Doppelpunkt ist das else.

    Ok Danke Pumuckl und _matze für die schnelle Hilfe 🙂
    achja und andre dir auch Danke 🙂 du hast recht ich weiß garnicth warum ich da jetzt Kommentare habe... und auch der rest bilft mir sehr weiter Danke erstmal dafür 🙂 🙂 🙂

    das hilft mir weiter!

    Ps: _matze du hast die geilste Signatur und du hast ja soooo recht ! 🙂

    gruß



  • Virokams schrieb:

    Ps: _matze du hast die geilste Signatur [...]

    Ansichtssache, ich will die schon lange mal ändern, aber ich bin einfach zu faul. 😃



  • Noch ne kurze verständnis Frage:

    es ist doch die Regel klammern vor hoch vor punkt vor strich oder?

    also bei einer Eingabe:

    (2^3(1+1))

    Ergebnis: 64?

    Wenn jaaa dann läuft mein Programm XD jetzt brauch ich nur noch das Ok... bin mir unsicher obs so richtig ist...

    (2^3(1+1)+2) also 66?

    Es ist falsch da muss 16 raus... mhhh



  • Virokams schrieb:

    Noch ne kurze verständnis Frage:

    es ist doch die Regel klammern vor hoch vor punkt vor strich oder?

    also bei einer Eingabe:

    (2^3(1+1))

    Ergebnis: 64?

    mal vorausgesetzt dass zwischen der 3 und der ( ein implizites * steht, bedeutet das
    2^3 * (1+1) = 8 * (1+1) = 8 * 2 = 16

    (2^3(1+1)+2) wäre also 18



  • Du weißt ja, dass du "^" in C++ nicht zum potenzieren nehmen kannst, ne (ist bitweises Oder)? Nur zur Sicherheit... 🙂



  • _matze schrieb:

    Du weißt ja, dass du "^" in C++ nicht zum potenzieren nehmen kannst, ne (ist bitweises Oder)? Nur zur Sicherheit... 🙂

    ohje also kann ich in meinem Programm garkein ^ abfragen dann:

    ...
    
    case '^':
    		double zwspeich = w1;
    		for (int i=1; i <= w2-1; i++)
    		{
    		zwspeich = zwspeich * w1;
    		}
    		erg = zwspeich;
    		break;
    ...
    

    machen
    ?!

    ohje ohje und ich dachte ich wär gleich fertig XD



  • Dafür gibt's auch 'ne Funktion, keine Sorge: pow()



  • _matze schrieb:

    Dafür gibt's auch 'ne Funktion, keine Sorge: pow()

    als ich pow() genutzt habe kam eine Fehlermeldung... moment ich schrieb mal kurz um

    Edit:

    pow: Bezeichner wurde nciht gefunden

    ?!

    Erledigt... pow machts mir fehlte das include math.h 😉



  • Hast du <cmath> inkludiert?

    EDIT: Nimm <cmath> statt math.h ...



  • _matze schrieb:

    Hast du <cmath> inkludiert?

    EDIT: Nimm <cmath> statt math.h ...

    cmath.h no such file in directory ?!

    wasn der unterschied zu math.h?



  • Nicht cmath.h, sondern cmath. Die C++-Header haben keine Endung, im Gegensatz zu den alten C-Headern. math.h gilt als veraltet, man soll cmath inkludieren. Ist einfach so. 😉 Einen Unterschied bei den Funktionen wirst du wohl nicht bemerken, zumal cmath, wenn ich mich nicht irre, sowieso math.h einbindet...


  • Administrator

    _matze schrieb:

    Nicht cmath.h, sondern cmath. Die C++-Header haben keine Endung, im Gegensatz zu den alten C-Headern. math.h gilt als veraltet, man soll cmath inkludieren. Ist einfach so. 😉 Einen Unterschied bei den Funktionen wirst du wohl nicht bemerken, zumal cmath, wenn ich mich nicht irre, sowieso math.h einbindet...

    Doch, es hat einen Unterschied. Die Funktionen befinden sich unteranderem dann auch im Namensraus std . Also man kann std::pow statt pow schreiben, muss es aber glaub ich nicht unbedingt.

    Edit: Übrigens ist '^' nicht das Bitweise Oder, sondern das XOR.

    Grüssli



  • _matze schrieb:

    Nicht cmath.h, sondern cmath. Die C++-Header haben keine Endung, im Gegensatz zu den alten C-Headern. math.h gilt als veraltet, man soll cmath inkludieren. Ist einfach so. 😉 Einen Unterschied bei den Funktionen wirst du wohl nicht bemerken, zumal cmath, wenn ich mich nicht irre, sowieso math.h einbindet...

    läuft 🙂

    nur mein Programm noch nicht...

    bei 2+(2^8)+(2+2) kommt 260 raus... Falsch
    bei 2+(2^8)+(2+2)+2) kommt 264 raus... richtig

    hängt bei mir wohl daran das er bei 1. Fall das hintere + nimmt ab dort spaltet...

    "sch*%$(%" wenn ich das mal sagen darf...



  • Dravere schrieb:

    Also man kann std::pow statt pow schreiben, muss es aber glaub ich nicht unbedingt.

    Doch muss man. Zumindest wenn der Header Standardkonform ist. Umgehen kann mans dann durch das übliche using namespace std; Eventuell sind einzelne Hersteller so "hilfreich", dass sie mit <cmath> und den anderen C-Headern die Funktionen sowohl im globalen als auch im std-Namensraum einführen (und damit die Intentionen des Standards ad absurdum führen)



  • Dravere schrieb:

    Edit: Übrigens ist '^' nicht das Bitweise Oder, sondern das XOR.

    Upps, na klar... 😃


Anmelden zum Antworten