"cout" Text zu Variable hinzufügen
-
Anders als beispielsweise in Java, kennt C++ den "+"-Operator nicht als Stringkonkatenierung ...
Das ist ein beliebter Anfängerfehler.
-
-
Ja, aber das gilt doch nur, wenn er denn std string auch verwendet, afaik.
-
@omggg ja, er nutzt eben keinen C++ String, sondern ein C-String bzw. ein Char Array. Aber, dass es in C++ den Operator für Strings nicht gibt ist falsch.
-
Doch, C++ kann mit "+" umgehen.
Dieser Code hier funktioniert:
cout << "Wert:" + zwei << endl;
Das Problem ist nur das "&" bei der Variable um die Adresse auszugeben.
Es muss doch möglich sein, das ich das "&" verwende und trotzdem einen Text in
Cout einfügen kann?SG
-
@C91 sagte in "cout" Text zu Variable hinzufügen:
Doch, C++ kann mit "+" umgehen.
Dieser Code hier funktioniert:
cout << "Wert:" + zwei << endl;
Und gibt was aus? "rt:"? Willst du uns verarschen, wenn du das als "funktioniert" bezeichnest?
-
Sorry, fehler von mir!
Funktioniert auch nicht, obwohl er es kompiliert ohne Fehler.
Ich habe es nicht ausgeführt, weil ich davon ausgegangen bin, das wenn er es fehlerfrei kompiliert, das es dann auch funktioniert.
Bei der Ausführung bleibt das Fenster leer.Sorry, nochmal.
-
@C91 sagte in "cout" Text zu Variable hinzufügen:
Funktioniert auch nicht, obwohl er es kompiliert ohne Fehler.
Nö, der GCC meldet:
error: invalid operands of types 'const char [7]' and 'int*' to binary 'operator+'
Der Visual Studio C++ Compiler MSVC meldet:
error C2110: '+': cannot add two pointers
Quelle: https://godbolt.org/
Was für ein Compiler nutzt du? Welche IDE?
-
@C91 sagte in "cout" Text zu Variable hinzufügen:
Sorry, fehler von mir!
Funktioniert auch nicht, obwohl er es kompiliert ohne Fehler.
Ich habe es nicht ausgeführt, weil ich davon ausgegangen bin, das wenn er es fehlerfrei kompiliert, das es dann auch funktioniert.Der Compiler macht, was du ihm sagst, nicht was du meinst.
Und er hat seine eigenen Regeln.
-
@C91 sagte in "cout" Text zu Variable hinzufügen:
cout << "Adresse:" + &zwei << endl;
"Adresse"
ist ein Pointer aufconst char
. Das&zwei
ist auch ein Pointer - auf als was auch immer duzwei
deklariert hast. Das+
wird also versuchen, 2 Pointer zu addieren.Wenn du
cout << "Adresse:" + 2 << endl;
schreibst, dann wird 2 zum Pointer addiert und du bekommstresse:
als Ausgabe (die ersten 2 Zeichen abgeschnitten). Wenn du Warnungen aktiviert hast im Compiler:warning: adding 'int' to a string does not append to the string [-Wstring-plus-int] cout << "Adresse:" + 2 << endl;
Wenn du mehrere Sachen ausgeben willst, schreib doch einfach
cout << "Adresse:" << &zwei << endl;
Also mit
<<
getrennt. Wenn du wirklich einen String machen willst, kannst du dir auch einmal https://en.cppreference.com/w/cpp/utility/format anschauen.Statt
endl
kannst du auch'\n'
nutzen, wenn du das flush nicht unbedingt benötigst (relevant z.B. wenn du größere Dateien rausschreibst)
-
Danke für diese Erklärung, dass
"<...>" + intConstVal
zu Pointer konvertiert, und dann den Pointer weitersetzt, wusste ich selbst noch nicht.
-
@omggg sagte in "cout" Text zu Variable hinzufügen:
Danke für diese Erklärung, dass "<...>" + intConstVal zu Pointer konvertiert,
Das habe ich nicht geschrieben. Ich habe geschrieben, dass
"string"
bereits ein Pointer ist, nicht dass da irgendwas in Pointer konvertiert wird. Pointer + Zahl addiert dann die Zahl zum Pointer dazu unter Beachtung der Größe der Objekte, auf die der Pointer zeigt, d.h.pointer + 1
zeigt auf das folgende Objekt.Edit: Ah ja, ihr habe natürlich recht, dass
"string"
einconst char[7]
ist. Sorry, dass ich hier Verwirrung gestiftet habe.
-
Technisch ist aber ein String-Literal
"..."
einconst char[N]
und wird dann bei+
zu einem Zeiger (pointer decay).
-
Tatsächlich ist
"string"
einconst char[7]
. Und der Standard nennt dieses Verhalten von Arrays, dass sie sich bis auf 2-3 Ausnahmen wie ein Pointer verhalten, eine "Konvertierung".
-
@wob sagte in "cout" Text zu Variable hinzufügen:
Das habe ich nicht geschrieben. Ich habe geschrieben, dass "string" bereits ein Pointer ist,
Das ist aber nur die halbe Wahrheit, tatsächlich ist es ein Pointer auf einen Speicherbereich, der eine Zeichenkette darstellt...
-
@omggg sagte in "cout" Text zu Variable hinzufügen:
@wob sagte in "cout" Text zu Variable hinzufügen:
Das habe ich nicht geschrieben. Ich habe geschrieben, dass "string" bereits ein Pointer ist,
Das ist aber nur die halbe Wahrheit, tatsächlich ist es ein Pointer auf einen Speicherbereich, der eine Zeichenkette darstellt...
Nein. Es ist ein
const char[7]
.
-
Bitte zerfleischt euch nicht ... ich weiß (fast genau), was gemeint ist.
-
@omggg sagte in "cout" Text zu Variable hinzufügen:
Bitte zerfleischt euch nicht ... ich weiß (fast genau), was gemeint ist.
Nein, tust du nicht.
-
Ich der JLS (und die habe ich gelesen) wird in vergleichbaren Fällen jedenfalls auch von "Konvertierung" gesprochen, das genügt mir. ... Und ja, eine Referenz in Java ist quasi auch einfach nur ein Pointer.
-
@omggg Einem Pointer kannst du einen anderen Wert (Adresse) zuweisen.
Dann zeigt er woanders hin.Bei einem
const char[...]
geht das nicht. Der verweist immer auf denselben Speicher.