"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.
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.
-
Danke für die Erklärung. ... Dann eben ein konstanter Pointer auf einen Speicherbereich, der eine Zeichenkette darstellt, und mit dem gerechnet werden kann.
-
...
Frage: Was wird cout << "hallo" + 2; in C++ ausgeben? ChatGPT: In C++ wird der Ausdruck "hallo" + 2 als Zeiger auf das dritte Zeichen im String interpretiert, da die Zeichenkette als Array von Zeichen betrachtet wird und die Addition eines gegebenen Index zur Verschiebung im Array führt. Wenn wir also "hallo" als Array von Zeichen betrachten und 2 addieren, verweist der resultierende Zeiger auf das dritte Element, also auf das 'l'. Daher wird "lo" ausgegeben.
Ist das zu ungenau?
-
@omggg sagte in "cout" Text zu Variable hinzufügen:
[...] Daher wird "lo" ausgegeben.
Ist das zu ungenau?
Die Begründung ist richtig, aber das Ergebnis falsch. Es wird natürlich "llo" ausgegeben. ChatGPT ist da mit dem "dritten Element" und dem Index 3 durcheinander gekommen.
-
Danke, das ist richtig. Ich habe das Model 3.5-turbo verwendet. Es ist gut möglich, dass mit 4 das Ergebnis anders aussehen würde... Generell kann das Sprachmodell nicht so gut rechnen. Frage es zum Beispiel mal nach einer hohen i.-ten Primzahl. Es wird eine "ungefähr im richtigen Bereich" richtige Primzahl zurückgeben.
-
... Und es hat zum Beispiel schon Schwierigkeiten, zu einem gegebenen Datum 2000 Tage zu addieren.
-
@omggg Vielleicht solltest du dich mal damit auseinandersetzen, wie so ein Language Model funktioniert: https://writings.stephenwolfram.com/2023/02/what-is-chatgpt-doing-and-why-does-it-work/