[C++] Überraschend, aber wahr

DataNaut

Cadet 2nd Year
Registriert
Nov. 2005
Beiträge
31
Hallo Programmierer,
manchmal machen Programme etwas anderes, als man beim ersten Hinsehen vermutet.

[C++] Überraschend, aber wahr
soll eine Sammlung solcher verblüffender Codeschnipsel sein.
Und dann fang ich gleich mal an. Der schnell dahin programmierte Versuch, einen Zähler an ein String zu hängen, ergab folgenden Code:

Code:
for (int i = 0; i < 5; i++)
    {
    string s_string = "Runde Nr.: " + i;
    cout << s_string << endl;
    }
Die Ausgabe ist, überraschend, aber wahr:
Code:
Runde Nr.:
unde Nr.:
nde Nr.:
de Nr.:
e Nr.:
Warum das so ist? Mal selber nachdenken ;) . Ich fands überrasched, dass das ganze kompiliert hat.
Gruss
DataNaut


--------------------------------------------------------------------------------------
Und nun das ganze etwas übertrieben:
Code:
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;

int main(int argc, char *argv[])
{
    for (int i = 0; i < 20; i++)
    {
    string s_string = "Runde Nr.: " + i;
    cout << s_string << endl;
    }
    system("PAUSE");
    return EXIT_SUCCESS;
}
Der Zähler zählt nun bis 20.
die Ausgabe ist nun:
Code:
Runde Nr.:
unde Nr.:
nde Nr.:
de Nr.:
e Nr.:
 Nr.:
Nr.:
r.:
.:
:


PAUSE
AUSE
USE
SE
E



Drücken Sie eine beliebige Taste . . .
 
Zuletzt bearbeitet von einem Moderator: (Bitte künftig den Ändern-Button benutzen. ;))
DataNaut, das ist nicht überaschend :) das ist ganz normal un kein "phänomen"
 
Was willst du für ne Antwort. Es ist verwunderlich, aber erklärbar und logisch (zumindest für mich).
 
"Runde Nr.: " + i wird von C als Pointer gesehen, wobei "Runde Nr.: " die Anfangsaddresse ist und i hinzu addiert wird. Am Anfang bei i=0 zeigt der Pointer also genau auf 'R', dann bei i=1 zeigt er auf 'u'. Das ist in keinster Weise komisch sondern völlig logisch ;) Die Reste von "Pause" stehen mehr oder weniger zufällig da, weil das "PAUSE", danach im Speicher steht. Wenn du i bis 1000.000.000 laufen lässt bekommst du nen Ausnahmefehler, weil du nachher auf Speicher zeugreifst, der deinem Programm nicht gehört.
 
Zuletzt bearbeitet:
Ach, wenn ich gewusst hätte, dass hier so wenig Humor vorhanden ist, hätte ich das ganze sein gelassen.
 
Ich finds schon ziemlich interessant. Wenn ich ehrlich bin, und nicht die Ausgabe sofort gelesen hätte, hätte ich auch etwas anderes erwartet. ;)
Insbesondere bin ich es persönlich in diesem Fall von Qt gewohnt dass man Zahlen auf QStrings addieren kann, und diese dann tatsächlich an den String angehangen werden.
 
du kannst nru 2 strings addieren keine zahlen
 
Informatiker ... Humor ... also wenns um unerwartete Programmabläufe geht, verstehen Infomratiker leider keinen Spass - da gehts eher an die Nerven und an Büroausstattung (Tastatur)
 
ich mein in c++

string1 = hallo;
string2 = du

string3 = string1 + string 2;

dann steht in string3: hallodu

oder string 1 + "du"; geht auch

edit: p.s.ich hab schon einige tastaturen zertrümmert :D
 
Mal an dieser Stelle was interessantes von Guru of the Week

In der Tat eine Gurufrage, aber wieviele Fehler sollte folgender Code auf einem absolut standardkonformen Compiler geben?

Code:
struct X {
  static bool f( int* p )
  {
    return p && 0[p] and not p[1:>>p[2];
  };
};

Antwort:
Keinen. Allerdings wird es vermutlich nicht kompilieren wenn man das in einen Compiler klatscht, da z.b. die and und not Schlüsselwörter oft deaktiviert sind (weil ungenutzt und verwirrdend), genauso wie Digraphen (:>). Die exakte Erklärung gibt's wenn man dem Link oben folgt.
 
Zuletzt bearbeitet:
Zurück
Oben