Was tut for(int i = 0; a[i]; i++) bedeuten?

Ich habe eine string a.
Was bedeutet die Bedingung a[i] in der for-Schleife for(int i = 0; a[i]; i++) bedeuten?

  • uhm, was? es soll es sich um einen booleschen Ausdruck oder vielleicht 0 oder 1?
  • Dies ist nicht der richtige Weg zu iterieren durch einen string.
  • Sie sollte die post eine kompilierbare Beispiel. Trotzdem, der mittlere Teil des for-Ausdrucks einen booleschen Wert, so wird der compiler versuchen, zu konvertieren, was auch immer Sie schreiben es, um ein bool. Wenn die Konvertierung vorgenommen werden kann, wird es kompiliert. In deinem Fall wird es bewerten a[i]. Nehme an (vermute), dass es ein char ist, wird es konvertieren, um ein bool. Es wird false, wenn a[i] gleich 0 ist, und andernfalls true.
  • Es ist nicht immer notwendig, buchen Sie eine vollständig kompilierbare Beispiel. Ich denke, die pose ist ganz klar und das schließen von Anfragen, die eher hart.
  • Auf einen zweiten Gedanken, ich bin mit Ihnen einverstanden. Die konkrete Frage „was hat eine[i] bedeuten?“ beantwortet werden kann mit der zur Verfügung gestellten Informationen. Eigentlich, wenn a ist ein string, a[i] (für eine gültige i) ist ein char, also keine raten oder vorausgesetzt wird, erforderlich. Da er von 0 startet, a[i] ist garantiert gültig.
  • Ich glaube nicht, dass a[i] ist einfach ein char, wenn es in einem zweiten Teil einer Schleife.
  • Was redest du? wenn a ist ein string, dann a[i] ist ein char (oder vielleicht ein const char&). Egal, ob in einer Schleife oder nicht.
  • Wenn a ist ein string, a[i] (für einen gültigen Wert der integer-index i) ist ein char. In einem zweiten Teil der Schleife, der char wird implizit in einen bool -, um den Wert der loop-Fortsetzung-Zustand.

InformationsquelleAutor quokka | 2017-04-25



4 Replies
  1. 1

    In diesem Fall „for(int i = 0; a[i]; i++)“, die Schleife hält seine Ausführung so lange, bis eines seiner Elemente sind ein null-element. Immer, wenn Sie sehen, dieser Ausdruck, es ist immer die gleiche Bedeutung, das ist die überprüfung, ob element ist oder nicht null ist, um um die Schleife zu stoppen.

    Jedoch, dass die Schleife hat ein nicht definiertes Verhalten, denn wenn der index i wird, kommt an die maximale array-Größe. Es ist wahrscheinlich, dass Sie gehen, um zu erhalten eine run-time Fehlermeldung der Art:

    Fehler, der außerhalb der Reichweite array-Größe, oder Sie versuchen, Zugriff auf einen null-Raum der Erinnerung.

    Ich hoffe, dass meine Antwort, es ist geeignet für Ihr problem..

    • Allerdings, dass die Schleife hat ein nicht definiertes Verhalten“ – im Allgemeinen, vielleicht, aber in diesem besonderen Beispiel, es ist gut definiert Verhalten in C++11 und später, weil a ist ein std::string, und std::string::operator[] definiert, die in C++11 für die Rückgabe einer Referenz auf ein null-Zeichen, wenn i == a.size().
  2. 2

    for(int i = 0; a[i]; i++) hat die gleiche Bedeutung wie for(int i = 0; a[i] != 0; i++), was bedeutet, „geben Sie die Schleife, bis das element a[i] bekommt 0; wenn a ist ein string, dann bedeutet dies, „geben Sie die Schleife, bis Sie a[i] Punkte auf der string-Endzeichen \0.

    Beachten Sie jedoch, dass C++ bietet andere Möglichkeiten des Durchlaufens der Zeichen einer Zeichenkette, wie zum Beispiel for (auto c : a) { cout << c << endl; }

  3. 2

    Die variable i wird initialisiert, um 0 dann erhöht, bis a[i] ist (oder konvertiert) falsch, d.h. a[i]==0. So i Schleifen über alle Zeichen in der Zeichenfolge bis zum ersten auftreten von \0. Für die üblichen null-terminierte Zeichenfolge, dies entspricht

    for(auto c:a)
    • Sie wollen nicht, um einen Spaziergang durch eine string wie in der OP-code.
    • Richtig, aber das war nicht die Frage. Es ist nicht so schlimm, wenn.
    • warum nicht? Einfach nur neugierig, es kann nicht sein, idiomatischer, aber es funktioniert gut
    • Diese Schleifen sind nicht gleichwertig. for(auto c:a) wird die Schleife über den gesamten string. for(int i = 0; a[i]; i++) wird die Schleife, bis Sie es findet das erste null-Zeichen, das darf nicht der gesamte string.
    • Okay, aber das macht nur einen Unterschied für andere als null-terminierte “ strings. Habe ich geändert, meine Antwort entsprechend.
  4. -2

    Gesuchten chars von string-pointer-array-eins nach dem anderen. Jedoch, weil es definiert wird als string in Ihre code -, compile-Zeit-Fehler Auftritt.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.