c++ - programming - Warum im Code "456"+1 die Ausgabe "56" ist




c++ programming (2)

Diese Frage hat hier bereits eine Antwort:

#include <iostream>
int main()
{
    std::cout << "25"+1;
    return 0;
}

Ich erhalte "5" als Ausgabe. Wenn ich "5" + 1 verwende, ist die Ausgabe leer, "456" + 1 ist die Ausgabe "56". verwirrt, was sich hinter den Kulissen abspielt.


Das Zeichenfolgenliteral "25" ist in Wirklichkeit ein Zeichenarray vom Typ const char[3] mit den Werten {'2', '5', '\0'} (die beiden angezeigten Zeichen und ein Nullterminator). In C und In C ++ können Arrays leicht zu Zeigern auf ihr erstes Element zerfallen. Dies ist, was in diesem Ausdruck passiert:

"25" + 1

wobei "25" auf &"25"[0] abfällt oder ein Zeiger auf das erste Zeichen. Wenn Sie 1 hinzufügen, erhalten Sie einen Zeiger auf 5 .

Darüber hinaus gibt std::ostream , von dem std::cout eine Instanz ist, eine const char* (beachten Sie, dass char* auch funktionieren würde), indem angenommen wird, dass es sich um eine nullterminierte Zeichenfolge handelt. In diesem Fall werden also nur 5 gedruckt.


Hinter den Kulissen ist "25" ein Array aus drei Zeichen: zwei für '2' und '5' und ein Abschlusszeichen mit dem Wert Null, um das Ende zu markieren.

Ein Array ist eine etwas seltsame Kreatur, die dazu neigt, sich in einen Zeiger (auf das erste Element) zu verwandeln, wenn Sie etwas damit anfangen. Das ist, was hier passiert: Hinzufügen eines zu einem Array ist nicht sinnvoll, so dass es sich in einen Zeiger verwandelt. Das Hinzufügen eines zu diesem gibt einen Zeiger auf das zweite Zeichen.

Wenn ein Zeiger auf ein Zeichen gegeben wird, geht << davon aus, dass es auf eine terminierte Zeichenfolge verweist, und druckt die Zeichen so lange, bis ein Terminator gefunden wird (oder explodiert auf irgendeine Weise, falls es keinen gibt). Wenn Sie also einen Zeiger auf das zweite Zeichen eines Strings geben, werden alle Zeichen ab dem zweiten Zeichen gedruckt, wie Sie gesehen haben.

Wenn Sie C und C ++ noch nicht kennen, sollten Sie zunächst entscheiden, welche Sprache Sie zuerst lernen möchten, da sie sich stark voneinander unterscheiden. Wenn Sie sich für C ++ entscheiden, sollten Sie sich mit der benutzerfreundlichen Bibliothek auf hoher Ebene vertraut machen (z. B. std::string um mit Zeichenfolgen ohne diese Art von Verrücktheit umzugehen), bevor Sie in den Wahnsinn von Arrays und Zeigern auf niedriger Ebene eintauchen .





c++