Warum ist name
sich im folgenden C++-Code falsch verhalten?
string name = "ab"+'c';
Wie würde sich der entsprechende Code in Java/C# verhalten?
Warum ist name
sich im folgenden C++-Code falsch verhalten?
string name = "ab"+'c';
Wie würde sich der entsprechende Code in Java/C# verhalten?
Ein C++-Compiler verkettet nicht automatisch String-Literale mit Zeichen-Literalen. Aber er wird String-Literale miteinander verketten. Die Syntax ist wie folgt:
const char * cs = "ab" "c"; // append string-literals
Wie andere bereits erwähnt haben, string
ist keine eingebaut C++-Sprachtyp. Aber es gibt eine string
Typ in der C++-Standardbibliothek. Hier sind einige Anwendungsbeispiele:
#include <string>
const char * cs = "ab" "c";
std::string s1( cs );
std::string s2( "ab" "c" );
std::string s3 = "ab" "c";
Nun, in C++ würde ich normalerweise folgendes tun
string name = string("ab") +'c';
Denken Sie daran, dass das wörtliche "ab" lautet no vom Typ String. Was Sie taten, war zu hoffen, dass es keine "+", die zwischen char Arrays und chars funktioniert, und dann hoffen, dass der Compiler könnte irgendwie bemerken, dass Sie wirklich wollen, dass das Ergebnis ein std::string sein, und dann gehen Sie Ihren Ausdruck auf der rechten Seite für eine Kombination von impliziten Konvertierungen, die mit dem Operator (s) kombinieren könnte, um ein Ergebnis dieses Typs zu produzieren analysieren. Scheint mir eine ziemlich große Aufgabe zu sein.
Egal, das ist nicht wichtig. In C besteht der einzige Unterschied zwischen einem Array und einem Zeiger darin, wie der Speicher zugewiesen wird. Sobald Sie einen haben, haben Sie im Wesentlichen ein "Array/Zeiger-Ding". Daher ist "+" ein für alle Arrays und Zeiger definierter Operator, der ein weiteres Argument eines beliebigen ganzzahligen Typs annimmt, Zeigerberechnungen durchführt und einen Zeiger auf so viele Elemente hinter dieser Stelle zurückgibt. Außerdem ist "char" in C eigentlich nur eine andere Art von Integer-Typ. Diese C-Design-Entscheidungen waren beide nützlich Hacks Aber wie so oft bei Hacks, führen sie zu intuitiv unerwarteten Ergebnissen. So ist alles, was "ab" + 'c' für Sie tut, eine Adresse 99 Bytes nach dem Ort, an dem das "ab"-Literal zufällig im Speicher gespeichert ist, zurückzugeben.
Manchmal können Sie sich auf implizite Konvertierungen verlassen, aber in anderen Fällen müssen Sie wirklich bereit sein, Ihrem Compiler ein wenig unter die Arme zu greifen.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.