4 Stimmen

Können ein Zeichenfolgenliteral und ein Zeichenliteral verkettet werden?

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?

1voto

Jon Tackabury Punkte 44954

Sie können Strings und Chars in C# verketten - es ist nicht so streng wie C++ ich denke.

Das funktioniert in C# ganz gut:

string test = "foo" + 'b';

1voto

jwfearn Punkte 27520

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";

1voto

T.E.D. Punkte 42630

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.com

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.

Powered by:

X