Wofür das &-Zeichen?



  • Hallo,
    ich habe ein Programm geschrieben, welches eigentlich Werte speichern und diese Ausgeben soll. Leider sind mir bis dahin Fehler unterlaufen. Ich habe bereits Lösungen bekommen, welche ich einigermaßen verstanden habe, aber ist hier einer so nett und erklärt mir das nochmals ^^

    #include <iostream>
    int main(){
        int anzahl;
        std::cout << "Wieviele Zahlen wollen Sie anlegen: ";
        std::cin >> anzahl;
        int zahlen[anzahl];
        for(int &wert : zahlen){
            std::cout << "Geben Sie einen Wert an: ";
            std::cin >> wert;
        }
        std::cout << "Gespeicherte Werte: " << std::endl;
        for(int ausgabe : zahlen){
            std::cout << ausgabe << std::endl;
        }
    }
    

    Meine erste Frage:
    Wofür ist das ':' Zeichen in der For-Schleife da?
    Meine zweite Frage:
    Warum braucht man das &-Zeichen bei der ersten For-Schleife, aber bei der zweiten nicht?
    Meine dritte und somit (vorerst ^^) die letzte Frage:
    Warum kann man nicht einfach direkt den Wert ausgeben? Also warum ist die zweite For-Schleife nötig?

    Tut mir leid, ich bin noch relativ neu in C++ haha...
    Freue mich für jede Antwort.
    Liebe Grüße!



  • @redexception sagte in Wofür das &-Zeichen?:

    Wofür ist das ':' Zeichen in der For-Schleife da?

    Das ist eine Range-based for loop.

    @redexception sagte in Wofür das &-Zeichen?:

    Warum braucht man das &-Zeichen bei der ersten For-Schleife, aber bei der zweiten nicht?

    Die range-declaration in einer Range-based for loop ist genau das: eine Deklaration. int& deklariert eine Referenz über die der referenzierte Wert geändert werden kann. In der ersten for-Schleife will man die Werte ändern und benötigt deshalb eine Referenz darauf, in der zweiten reicht der Wert als Kopie ohne das Original zu kennen für die Ausgabe.

    @redexception sagte in Wofür das &-Zeichen?:

    Warum kann man nicht einfach direkt den Wert ausgeben? Also warum ist die zweite For-Schleife nötig?

    Die meisten (sinnvollen) Programme machen irgendwas mit der Eingabe: EVA-Prinzip.

    Natürlich kannst Du das Eingelesene auch direkt wieder ausgeben:

    #include <iostream>
    
    int main()
    {
        int value;
        while (std::cin >> value)
            std::cout << value << '\n';
    }
    


  • @redexception sagte in Wofür das &-Zeichen?:

    int zahlen[anzahl];
    

    Das da ist übrigens kein Standart-C++. Standartkonform muss die Größenangabe für ein Array eine Konstante sein die zur Compiletime feststeht. Sowas solltest Du Dir nicht angewöhnen. Nimm std::vector<>!

    #include <vector>
    #include <iostream>
    
    int main()
    {
        std::cout << "How many numbers?\n";
        std::size_t num_numbers;
        std::cin >> num_numbers;
        std::vector<int> numbers(num_numbers);
        for (auto &number : numbers)
            std::cin >> number;
        std::cout << "The numbers you entered:\n";
        for (auto number : numbers)
            std::cout << number << '\n';
    }
    


  • @redexception sagte in Wofür das &-Zeichen?:

    int zahlen[anzahl];

    Du bist heute schon der Zweite mit diesem Konstrukt. Woher habt ihr das? In einem anständigen C++ Buch sollte das sicher nicht vorkommen.



  • @manni66 YAIT, presumably.



  • @manni66 sagte in Wofür das &-Zeichen?:

    @redexception sagte in Wofür das &-Zeichen?:

    int zahlen[anzahl];

    Du bist heute schon der Zweite mit diesem Konstrukt. Woher habt ihr das? In einem anständigen C++ Buch sollte das sicher nicht vorkommen.

    Halt! Du bist nur einer. Es wurde dir doch vorhin schon erklärt, dass das kein C++ ist!



  • This post is deleted!


  • @redexception sagte in Wofür das &-Zeichen?:

    Warum kann man nicht einfach direkt den Wert ausgeben? Also warum ist die zweite For-Schleife nötig?

    Naja wenn erst alle Zahlen eingegeben werden sollen und danach erst die Ausgabe erfolgen soll, dann braucht man halt die 2 Schleifen - eine für die Eingabe und eine für die Ausgabe.

    Wenn es OK oder sogar erwünscht ist dass jede Zahl sofort nach ihrer Eingabe wieder ausgegeben wird, dann braucht man nur eine Schleife. Wenn es geht hat das natürlich den Vorteil dass weniger Speicher benötigt wird und weniger Latenz zwischen Eingabe und Ausgabe besteht. Wie @Swordfish aber schon geschrieben hat machen die meisten Programme auch irgendwas mit den eingegebenen Daten bevor das Ergebnis wieder ausgegeben wird. Und je nachdem was das Programm macht geht das halt oder eben auch nicht.

    Angenommen man soll z.B. bei allen eingegebenen Zahlen prüfen ob sie eine Primzahl sind und dann halt "prime" oder "non-prime" ausgeben, dann geht das ohne Zwischenspeicher und 2. Schleife. Wenn man die Zahlen dagegen sortieren und dann sortiert wieder ausgeben soll, dann braucht man den Zwischenspeicher und die 2. Schleife.

    Und wenn in deiner Aufgabe steht dass erst alle Zahlen eingelesen werden sollen, gespeichert und dann alle Zahlen wieder ausgegeben, dann ist die Aufgabe vermutlich als Übung/Vorbereitung für etwas gedacht was eben nur so möglich ist. Das Programm an und für sich macht ja kaum Sinn - ausser natürlich als Übung.

    ps: Noch ein zweiter kleiner Tip: du mischt in deinem Programm wild die beiden Begriffe Zahl und Wert (bzw. deren Plural). Sowohl in den Bezeichnern als auch bei der Ausgabe. Solltest du dir auch abgewöhnen. Ein Programm das konsistent die selben Begriffe für die selben Dinge verwendet ist viel einfacher zu lesen. Ist jetzt kein Fehler und sicher nicht tragisch, aber ich denke dass du dir das Leben ein kleines bisschen leichter machen wirst wenn du von Anfang an ein wenig darauf achtest.



  • @manni66 Ich glaube es ist nur zur Veranschaulichung um die Basics zu erlernen. Wir würdest du es denn machen? Mit Vector? Könntest du mir das erkläten?



  • @hustbaer Danke für deine ausführliche Antwort ^^
    Ja , ich bin wie gesagt noch ganz weit am Anfang von C++. Darum ist das Programm nur eine Übungsaufgabe 🙂
    Liebe Grüße,
    Aleksej



  • @redexception sagte in Wofür das &-Zeichen?:

    @manni66 Ich glaube es ist nur zur Veranschaulichung um die Basics zu erlernen.

    Welche Basics denn? Es ist kein C++. Der Autor ( Jürgen Wolf oder Michael Bonacina.? ) deines Buches hat keine Ahnung.

    Wir würdest du es denn machen? Mit Vector? Könntest du mir das erkläten?

    Das hat @Swordfish doch schon gezeigt.



  • @manni66 richtig... Es ist Michael Bonacina 😕 Habe auch gerade gemerkt...



  • @redexception sagte in Wofür das &-Zeichen?:

    @manni66 richtig... Es ist Michael Bonacina 😕 Habe auch gerade gemerkt...

    Da kein Feuerwerk erlaubt ist, kannst du ja eine Bücherverbrennung machen ...



  • @manni66 Gute Idee


Log in to reply