Avatar billede mgsj Nybegynder
03. januar 2009 - 00:51 Der er 7 kommentarer

c++ String og string literal?

Hej
Sidder og nørkler med noget C++. Det er muligt det er den fremskredne tid på dagen, der gør at jeg ikke kan "se det" men...

1) const std::string hello = "Hello";
2) const std::string message = hello + ", world " + "!";

3) const std::string exclam = "!";
4) const std::string message = "Hello" + ", world" + exclam;

Hvorfor kan jeg ikke konkatenere den nederste string, altså nr. 4?
I MSVS2008 fås følgende: "error C2110: '+' : cannot add two pointers"

Jeg får ingen compiler fejl ved statement 2, hvor jeg så vidt jeg kan se konkatenrer 2 strings også, altså ligesom i 4'eren.

Jeg er sikker på det er et eller andet med strings vs. string literals. Men har ikke umiddelbart kunne finde en forklaring.

Og måske har jeg ikke lige helt styr på forskellen på en string og en string literal. Nogen der kan skære det ud i pap for mig?

På forhånd tak.
Avatar billede bertelbrander Novice
03. januar 2009 - 01:02 #1
I statement 2 lægger du en const char * (eller char[]) til en std::string, det er helt legalt, resultatet er den konkatinerede streng.

I statement 4 forsøger du at lægge en const char* (eller char[]) til en anden const char* (eller char[]) det går ikke.

Du kan skrive statement 4 som:
const std::string message = std::string("Hello") + ", world" + exclam;
Avatar billede mgsj Nybegynder
03. januar 2009 - 02:03 #2
Hej
Tak for svar.
Jamen jeg lægger vel også to char*(eller char[]) sammen i 2?
Altså 2) const std::string message = hello + ", world "    + "!";
så:                                string + string literal + string literal
Er det ikke korrekt forstået?

Men det er 4'eren ikke:
const std::string message = "Hello" + ", world"      + exclam;
så                  string literal + string literal + string

Håber jeg har forklaret det jeg ikke har forstået godt nok.
Avatar billede mgsj Nybegynder
03. januar 2009 - 02:32 #3
Ah. Nu tror jeg jeg har fundet ud af det.
Det er fordi + operatoren er left associative.
Så derfor går det godt i 2 hvor en string konkateneres med en string literal.
Dette bliver så en string, som så igen kan konkateneres med en string literal.

I 4'eren går det ikke, da det er 2 string literals der lægges sammen og det må man ikke.

Har jeg ikke ramt rigtigt?
Avatar billede bertelbrander Novice
03. januar 2009 - 02:38 #4
I 2 lægger du en string literal til en std::string, det giver en std::string, hertil lægger du en ny string literal, og det giver også en std::string.
Eller formuleret anderledes, det der sker er:
(std::string + string literal) + string literal
Og resultatet af det inden i parentesen er en std::string, compileren evaluerer fra venstre mod højre, og det er venstre sidens + operator der kommer i brug.
Det går alt sammen godt fordi std::string har en + operator der tager en string literal som højreside.

I 4 lægger du to string literals sammen, det går ikke.
Eller formuleret anderledes, det du forsøger er:
(string literal + string literal) + string
Her er der ikke nogen operator der kan bruges.
Avatar billede bertelbrander Novice
03. januar 2009 - 02:39 #5
Du kom før mig, du har ret.
Avatar billede mgsj Nybegynder
03. januar 2009 - 11:09 #6
Hej igen. Tak for info trods alt :-) Samler du på point?
Avatar billede bertelbrander Novice
03. januar 2009 - 12:52 #7
Nej, jeg samler ikke.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester