[SOLVED] goto und Destruktor-Aufruf



  • Blackskyliner schrieb:

    In dem Fall könnte man ein continue; machen wenn die sprungBool gesetzt ist, am besten dann in beiden Schliefen, damit dürfte es auch deinen Ansprüchen genügen. 🙂

    Dann mußt Du mir mal bei folgendem Problem helfen:

    #include <iostream>
    using namespace std;
    
    int main(){
    	for(int kandidat=2;kandidat<100;++kandidat){
    		for(int teiler=2;teiler*teiler<=kandidat;++teiler){
    			if(kandidat%teiler==0){
    				goto keinePrimzahl;
    			}
    		}
    		cout<<kandidat<<' ';
    		keinePrimzahl:;
    	}
    	return 0;
    }
    

    Als Mensch gehe ich so vor. Ich teste alle möglichen Teiler und wenn einer den Kandidaten teilt, ist es eben keine Primzahl und ich mache deswegen einfach mit dem nächsten Kandidaten weiter. Ich habe Angst, daß Zwischenvariablen hier die Einfachheit bombardieren. Und break/continue gehen nicht, um aus der inneren Schleife die äußere zu steuern.



  • volkard schrieb:

    Dann mußt Du mir mal bei folgendem Problem helfen

    bool isPrime(int);
    

    return ist zwar auch nur ein goto, aber das hier ist doch ein schöner Fall, in dem man seinen Code übersichtlicher und besser strukturiert macht, wenn man die innere Schleife in eine Funktion auslagert.



  • #include <iostream> 
    using namespace std; 
    
    int main(){ 
        for(int kandidat=2;kandidat<100;++kandidat){ 
            bool jump = false;
            for(int teiler=2;teiler*teiler<=kandidat;++teiler){ 
                if(kandidat%teiler==0){ 
                    //goto keinePrimzahl;
                    jump=true; 
                    break;
                } 
            } 
            if(!jump)
                cout<<kandidat<<' ';
    
            //keinePrimzahl:; 
        } 
        return 0; 
    }
    

    Ich geb zu wenige übersichtlich, vor allem wenn mann dann mehr als nur den Kandidaten ausgeben will und entsprechend noch verarbeiten will aufgrund der Bedingung... aber es ist möglich 🙂 Wobei man schon sagen muss, dass ein goto eleganter erscheint 🙂

    EDIT: @Michael E.: Sein Beispiel war ja dazu gedacht, meine Aussage zu "entkräften".



  • DANKE!!!

    Ehrlich gesagt hab ich jetzt mit einer 'Wie kann man nur goto verwenden?'-Diskussion gerechnet 😮



  • Nur der Vollständigkeit halber, da die IDE eh schon damit offen war.

    #include <iostream>
    using namespace std;
    
    bool isPrime(int kandidat) {
    	for (int teiler=2;teiler*teiler<=kandidat;++teiler) {
    		if (kandidat%teiler==0) {
    			return false;
    		}
    	}
    	return true;
    }
    
    int main() {
    	for (int kandidat=2;kandidat<100;++kandidat) {
    		if (isPrime(kandidat)){
    			cout<<kandidat<<' ';
    		}
    	}
    	return 0;
    }
    


  • Dann sollte man isPrime inline machen, damit man nicht den Overhead eines Stackpushes hat 🙂 Ich weiß ich bin ein Krümmelkacker Ar*** Ich entschuldige mich jetzt mal dafür und geh ins Bett, bevor ich noch mehr Unsinn Poste 🙂

    Aber auf die Idee, das als Funktion auszulagern um das goto zu umgehen muss ich mir mal merken 👍



  • Blackskyliner schrieb:

    Aber auf die Idee, das als Funktion auszulagern um das goto zu umgehen muss ich mir mal merken 👍

    Es geht nicht darum das goto zu umgehen, weil es böse ist, sondern darum den Code logisch zu Gliedern und Konzepte auszulagern, was sehr Vorteilhaft ist.

    Bei volkards Beispiel sieht man sofort, was es machen soll, während man bei den anderen Beispielen zuerst den Code wirklich anschauen muss, damit man versteht, was er machen soll.
    Und das ist nur einer von vielen Vorteilen (Wartbarkeit, Wiederverwendbarkeit, Lesbarkeit, Fehleranfälligkeit usw.)



  • drakon schrieb:

    Blackskyliner schrieb:

    Aber auf die Idee, das als Funktion auszulagern um das goto zu umgehen muss ich mir mal merken 👍

    Es geht nicht darum das goto zu umgehen, weil es böse ist, sondern darum den Code logisch zu Gliedern und Konzepte auszulagern, was sehr Vorteilhaft ist.

    Bei volkards Beispiel sieht man sofort, was es machen soll, während man bei den anderen Beispielen zuerst den Code wirklich anschauen muss, damit man versteht, was er machen soll.
    Und das ist nur einer von vielen Vorteilen (Wartbarkeit, Wiederverwendbarkeit, Lesbarkeit, Fehleranfälligkeit usw.)

    Nicht immer. Also ich kenne auch folgendes Szenario nur all zu gut.

    Irgendwie ist das Verfahren kompliziert und unübersichtlich. Man lagert aus, um das goto oder die künstliche Variable loszuwerden. Und dann erst kapiert man, was man ausgelagert hat und daß es gut ist. Und man kann dem Ausgelagerten einen sinnvollen Namen geben. Und dadurch erst begreift man das Verfahren.



  • Das ist ja eigentlich das, was ich gesagt habe. Wenn man von Anfang an eben die Sachen gliedert, dann braucht man eigentlich nie ein goto . Spätestens, wenn man versucht ist es hinzuschreiben, dann sollte man sich nochmal überlegen, was man genau macht. Und wie du sagst erübrigt sich damit eh sehr vieles gleich von vorne weg.

    Ich wollte damit ja sagen, dass man ein goto nicht einfach per se umgehen muss, sondern dass es einfach ein Indikator für zu komplizierte Systeme ist und man da besser nochmal drüber geht, was zur Folge hat, dass es sowieso wegfällt.



  • Nur der Vollständigkeit halber (weil ich bislang 80% der mMn überflüssigen gotos in dem Zusammenhang gesehen habe) sollte man auch noch exceptions erwähnen.
    Prima Sache!

    Gruß,

    Simon2.


Anmelden zum Antworten