Aufgabe aus C++ Primer



  • Übung 2.22
    Das folgende Programmfragment ist zwar zulässig, aber ein Beispiel schlechten Stils. Welche Probleme enthält es? Wie würden sie es verbessern?

    for(int i = 0; i < 100; ++i)
    // Verarbeitet i
    

    Eure Meinung?
    Meine einzige Idee wäre dass i const sein muss, nicht dass es bei der Verarbeitung irgendwie den Wert ändert.

    MfG
    Stromberg



  • Stromberg schrieb:

    Meine einzige Idee wäre dass i const sein muss, nicht dass es bei der Verarbeitung irgendwie den Wert ändert.

    Aha. Eine Konstante inkrementieren... Sicher.

    Daran ist nichts schlechter Stil. Oder was ist mit "verarbeitet i" gemeint? Dass der Wert von i im Schleifenrumpf geändert wird? Falls ja, ist das nicht so schön, weil in For-Schleifen die Kontrolle der Schleifenvariable dem Schleifenkopf überlassen werden sollte.

    Aber um das genau zu sagen, müsste man schon ein wenig mehr über den Code wissen.



  • Nicht ganz. Es geht bei der Übung meiner Meinung nach eher darum zu erkennen, das die 100 eine sogenannte magische Zahl ist, da deren Bedeutung nicht gleich zu erkennen ist. Guck dir dazu nochmal den beginn von Abschnitt 2.4 auf Seite 83 des C++ Primers (4. Auflage) an.



  • Mizar schrieb:

    Nicht ganz. Es geht bei der Übung meiner Meinung nach eher darum zu erkennen, das die 100 eine sogenannte magische Zahl ist, da deren Bedeutung nicht gleich zu erkennen ist. Guck dir dazu nochmal den beginn von Abschnitt 2.4 auf Seite 83 des C++ Primers (4. Auflage) an.

    Naja, ich hab den Primer nicht, aber wenn es das ist... Irgendwie ein Witz. Wenn man beispielsweise 100 mal irgendeine Aktion durchführen will (und es nicht um die Grösse eines Arrays/Containers geht), aus welchem Grund auch immer, finde ich das schon legitim. Von mir aus kann man noch einen Kommentar darüber schreiben und dann ist die Sache erledigt.

    Wäre denn Folgendes für dich schöner?

    int UpperBoundConcerningThisAndThat = 100;
    for (int i = 0; i < UpperBoundConcerningThisAndThat; ++i)
      ...
    


  • Also, in dem von mir besagtem Abschnitt des Buches geht es um den Qualifizierer const . Es wird halt kurz darauf eingegangen wie man umfangreichere Programme lesbarer gestalten könnte, indem man z. B. statt:

    for(int index = 0; index != 512; ++index)
    // tu was
    

    folgendes schreibt:

    const int bufSize = 512; // Größe des Eingabepuffers
    for(int index = 0; index != bufSize; ++index)
    // tu was
    

    Ich muss aber auch zugeben, das ich (zumindest dem Buch nach) auch ganz gerne mal "magische Zahlen" verwende, eben in solche Situationen wie du sie meintest Nexus, also wenn irgendeine Aktion z. B. 100 mal ausgeführt werden soll.



  • Nexus schrieb:

    Wäre denn Folgendes für dich schöner?

    int UpperBoundConcerningThisAndThat = 100;
    for (int i = 0; i < UpperBoundConcerningThisAndThat; ++i)
      ...
    

    nicht nur für mizar. Magic numbers sind einfach schrcklich, wenn man den Code von fremden Leuten lesen muss.



  • In was für einer Situation muss man denn eine Aktion, ganz unabhängig von allen anderen Faktoren, genau 100 mal durchführen ? 😉 Mir fällt da echt nichts ein. Klärt mich auf.

    Gruß
    Don06



  • Mizar schrieb:

    folgendes schreibt:

    const int bufSize = 512; // Größe des Eingabepuffers
    for(int index = 0; index != bufSize; ++index)
    // tu was
    

    Normalerweise hat man das so eh nicht mehr. Meistens hat man eine .size/.length/.count - Methode, die das dann für dich erledigt.



  • Meine einzige Idee wäre dass i const sein muss, nicht dass es bei der Verarbeitung irgendwie den Wert ändert.

    Es ist völlig Sinnfrei. Du möchtest eine konstante Variable inkrementieren? Ohje..ohje...das wäre genau das richtige Beispiel um's falsch zu machen.
    Du kannst es nicht so machen:

    const unsigned int zu_inkrementierender_wert=100;
    for(int i=0; i < zu_inkrementierender_wert; i++)
    

    Stadtdessen....:

    unsigned int zu_inkrementierender_wert=100;
    for(int i=0; i < zu_inkrementierender_wert; i++)
    

    Das hätten wir dann mit dem "konstanten Inkrementation" geklärt.



  • Ich post hier einfach ma meine nächste Frage zu Primer, extra n neuen Thread aufmachen is ja irgendwie doof.

    Was hat dieser Code für einen Sinn, bzw. ich wusst gar nicht dass soetwas geht (= r + i):

    int i = 42;
    const int &r = 32;
    const int &r2 = r + i; //Hier würde doch "= r" den selben Effekt erzielen?
    

    Warum "r+i", es reicht doch "=r", den wenn etwas in "i" verändert wird, dann wird es auch in "r" verändert, und somit dann auch in "r2". Was bringt mir die Referenz "r2" auf "i"? In i kann ich doch sowieso nix verändern, weil "r2" ja const ist....
    Bzw. bedeutet dass "= r + i" vll. was ganz anderes?

    MfG
    Stromberg



  • Don06 schrieb:

    In was für einer Situation muss man denn eine Aktion, ganz unabhängig von allen anderen Faktoren, genau 100 mal durchführen ? 😉 Mir fällt da echt nichts ein. Klärt mich auf.

    Ich mach das ganz gerne mal um bestimmte Dinge meines Codes zu testen, z. B habe ich letztens ein bisschen mit Vererbung und "Zufallszahlen" herumgesponnen und um mir ein paar Stichproben ausgeben zu lassen, habe ich eben eine "magische Zahl" verwendet und nicht gleich ein Objekt. Eine bessere Situation, als zum Testen des Codes, fällt mir aber auf die schnelle auch nicht ein :).

    drakon schrieb:

    Normalerweise hat man das so eh nicht mehr. Meistens hat man eine .size/.length/.count - Methode, die das dann für dich erledigt.

    Ja, da gebe ich dir recht. Übrigens, die Codeschnipsel die ich hier gepostet habe sind nicht meinem Kopf entsprungen, sondern habe ich dem Buch entnommen und da das gerade mal das 2. Kapitel ("Variablen und grundlegende Typen") des Buches ist, tauchen halt die von dir benannten Methoden noch nicht auf :).



  • Don06 schrieb:

    In was für einer Situation muss man denn eine Aktion, ganz unabhängig von allen anderen Faktoren, genau 100 mal durchführen ? 😉 Mir fällt da echt nichts ein. Klärt mich auf.

    Du hast Recht, der Fall kommt relativ selten vor. Trotzdem gibt es ihn manchmal, zum Beispiel, wenn es ums Testen und Debuggen von irgendetwas geht (z.B. eigene Klassen, etc).

    ja schrieb:

    Nexus schrieb:

    Wäre denn Folgendes für dich schöner?

    int UpperBoundConcerningThisAndThat = 100;
    for (int i = 0; i < UpperBoundConcerningThisAndThat; ++i)
      ...
    

    nicht nur für mizar. Magic numbers sind einfach schrcklich, wenn man den Code von fremden Leuten lesen muss.

    Du hast aber schon gelesen, dass ich noch den Kommentar erwähnt habe? Das hat zusätzlich noch den Vorteil, dass man nicht eine unnötige Variable anlegt, die sowieso nur lokal benötigt wird und ausserhalb trotzdem sichtbar ist.



  • Stromberg schrieb:

    Ich post hier einfach ma meine nächste Frage zu Primer, extra n neuen Thread aufmachen is ja irgendwie doof.

    Const-Referenzen können - im Gegensatz zu normalen Referenzen - auch mit temporären Ausdrücke initialisiert werden. In diesem Falle zeigt die Referenz nicht mehr auf eine zuvor deklarierte Variable, sondern es wird ein Objekt angelegt, auf das die Referenz zeigt.


  • Administrator

    way schrieb:

    Du kannst es nicht so machen:

    const unsigned int zu_inkrementierender_wert=100;
    for(int i=0; i < zu_inkrementierender_wert; i++)
    

    Stadtdessen....:

    unsigned int zu_inkrementierender_wert=100;
    for(int i=0; i < zu_inkrementierender_wert; i++)
    

    Das hätten wir dann mit dem "konstanten Inkrementation" geklärt.

    Könnte es sein, dass du dich in deinen Codebeispielen etwas verschrieben hast? Denn das was du sagst, was man nicht tun sollte, ist absolut möglich und wird auch oft empfohlen ...

    @Stromberg,
    Zu deinem zweiten Problem. Eine Addition wird vor der Zuweisung durchgeführt. Die Referenz ist somit auf das Resultat gesetzt.

    Grüssli


Anmelden zum Antworten