Rekursionen: Fehler mit Dekrementierung



  • bigdilliams schrieb:

    Bei Funktionsaufrufen werden jegliche Nebeneffekte vor dem eigentlichen Sprung zur Funktion abgearbeitet.
    Dies beinhaltet insbesondere Nebeneffekte, welche bei der Auswertung der Argumentenliste entstehen.
    Am Ende einer Funktion wird aus der Funktion zurückgesprungen und wiederum werden sämtliche Nebeneffekte vollständig abgearbeitet.
    Es sei hier zusätzlich bemerkt, dass in C++ jeglicher Aufruf eines überladenen Operators als Funktionsaufruf gehandhabt wird.

    Ok, bei
    lZahl * fakultaet(--lZahl)
    wird vor dem Eintritt in die Funktion das -- echt bewirkt.
    Aber es ist nicht klar, ob der Compiler beim * erst den linklen odeer erst den rechten Teil berechnet.
    Also ob er
    lZahl * fakultaet(--lZahl)
    oder
    fakultaet(--lZahl) * lZahl
    denkt.



  • Ok, soweit verstanden, aber sollte das das Ergebnis eigentlich gar nicht beeinflussen?



  • bigdilliams schrieb:

    Ich hab noch ein Beispiel:

    void test(int zahl)
    {
    	cout << zahl << endl;
    }
    
    int main(int argc,char *argv[])
    {
    	int zahl = 5;
    	cout << zahl << endl;//klar, 5
    	test(--zahl);//klar, 4 wird an test übergeben. 
    
    	return 0;
    }
    

    Die Ausgabe:
    5
    4

    Warum ist die Ausgabe hier wieder so rum?

    Ähm, das ist doch völlig unproblematisch.



  • Ja ich hatte dort noch anderen Code in der IDE sry.



  • bigdilliams schrieb:

    Ok, soweit verstanden, aber sollte das das Ergebnis eigentlich gar nicht beeinflussen?

    Doch. Nehmen wir mal ein einfachetres Beispiel.

    int f(int n){
       return n;
    }
    ...
    int a=5;
    int x=a+f(--a);
    

    Da kann er machen draus

    int tmp1=a;//5
    int tmp2=f(--a);//4
    int x=tmp1+tmp2;//9
    

    oder

    int tmp2=f(--a);//4
    int tmp1=a;//4
    int x=tmp1+tmp2;//8
    

    Es kommt dabei nur darauf aun, wierum er den operator+ auswertet.



  • Einfach ganz ganz defensiv proggern.
    Immer, wenn ich in ein und dem selben Ausdruck eine Variable ändern will und auswerten und kein && oder sowas starkes dazwischen steht, while(c=getch() && c!=EOF) mal nennen, dann ist was kaputt an der Logig. Es würde anders hingeschrieben hübscher aussehen und besser lesbar sein.
    Auch beim n*fakt(n-1)//gut versus n*fakt(--n)//böse.
    Es gibt in der Praxis genau NULL Probleme. Ich habe nie erlebt, daß ein längerer unlesbarerer Ausdruck schneller wäre, als die Auflösung der Sequenzprobleme per Hand. Nee, falsch ausgedrückt. Es gibt per Hand keine. Ich habe nie erlent, daß man die normale Schreibung durch Verfrickelung beschleunigt wurde.

    edit: Doch, einmal. MSVC6, while(!~*p++) oder sowas in einem Langzahl-Arithmetik-Test war damals schneller als entsprechende lesbare Schleifen. Ist aber selten. Dann geht man besser nicht auf den Compiler ein, sondern wartet auf die nächte Version.



  • Endlich herausgefunden, danke für die Hilfe! Konnte wieder einiges dazu lernen.



  • bigdilliams schrieb:

    Ok, ich denke ich weiss was deine Kernaussage ist und ich werde sie in Zukunft beachten, doch hat sich mir eine Frage zu deinem vorherigen Beispiel aufgetan:

    int tmp2=f(--a);//4
    int tmp1=a;//4
    

    Wäre das erste a in der Funktion nicht in einem anderen Scope und hätte somit keinen Einfluss auf das andere a?

    Nö, ich sehe da keine Scopes. Hab ja keine Block-KLammern {} gemacht. Es sollte das selbe a sein.

    bigdilliams schrieb:

    Sry wegen der dummen Frage, aber ich will nur sichergehen, da ich gerade ein 1200 seitiges C++ Buch repetiere.

    Du weißt ja gar nicht, wie gut es tut, mal mit einem Anfänger zu reden, der tatsächlich ein ganzes Buch liest und wo man echt das Gefühl hat, daß die bescheidene Hilfe, die wir übers Netz leisten können, einem zukünftigen guten Informatiker in der Ausbildung deutlich Zeit spart.
    Die allermeisten Anfragen kommen von Leuten, die keine 50 Seiten gelesen haben und nichts mehr lesen, sich versuchen aus Codefragmenten und Foreneinträgen im Internet alles zusammenzutragen und nach 3 Wochen ein Betriebssystem, ein MMRPG und einen Compiler schreiben wollen und nur "wichtige Fragen" fragen, wie man einen Farbverlauf in den Menubalken kriegt, statt noch ein wenig an den Grundlagen zu arbeiten.

    Du kriegst immer hier qualifizierte Antwort, keine Bange. Deine Fragen bauen uns auf. Und bald biste ja auch einer, der mehr beantwortet als fragt.



  • Ja ich danke dir, habe die Frage geändert da ich in der IDE die Antwort fand. Ich fasse die Antwort zusammen:

    Es ist einfacher als gedacht, der Compiler führt in meinem Fall den rechten Operanden zuerst aus und wenn man dies so runter rechnet kommt man mit jeder Zahl auf 0. 🙂 🙂 🙂 🙂

    Vielen Dank an dich volkard und alle die das lesen.



  • bigdilliams schrieb:

    Ja ich danke dir, habe die Frage geändert da ich in der IDE die Antwort fand. Ich fasse die Antwort zusamen:

    Es ist einfacher als gedacht, der Compiler führt in meinem Fall den rechten Operanden zuerst aus und wenn man dies so runter rechnet kommt man mit jeder Zahl auf 0. 🙂 🙂 🙂 🙂

    Vielen Dank an dich volkard und alle die das lesen.

    Das war übrigens genau meine erste Antwort.
    Aber damals vor 2 Stunden hatte ich mich noch nicht verständlich ausdrücken können. 🙂

    Danke, daß Du nochmal die Lösung drunterschreibst, damit alle nachfolgenden Leser auch was davon haben.


Anmelden zum Antworten