2013-07-22 5 views
5

Ich habe versucht, zwei Buchstaben in einen String anhängen, aber es scheint, dass die Zeichenfolge nicht geändert wird:Ausgabe mit String :: operator + =

void fun() 
{ 
    string str; 
    str += 'a' + 'b'; 

    cout << str; 
} 

ich den Quellcode von STL überprüft und festgestellt, die Umsetzung der operator+= , aber ich weiß immer noch nicht warum.

basic_string& 
operator+=(_CharT __c) 
{ 
    this->push_back(__c); 
    return *this; 
} 
+7

Sie erkennen, dass ' 'a' + 'b'' auf eine ganze Zahl ausgewertet wird, und nicht auf' "ab"', nicht wahr? –

+0

was ist 'str' Anfangswert, den Sie tun' str = str + 'a' + 'b'; ' –

+1

@GrijeshChauhan: oder effizienter,' (str + = 'a') + = 'b'; '; -) –

Antwort

7

Durch das Hinzufügen 'a' + 'b' Sie 2 Zeichen haben zusammengerechnet eine andere Zeichen zu bilden. Dann fügen Sie es der Zeichenfolge mit += hinzu.

Dieser Code wird das tun, was Sie wollen:

std::string str; 
(str += 'a') += 'b'; 

std::cout << str; 
2

Sie haben hier nicht verwendet String. Verwenden Sie eine explizite Umwandlung. Oder deklarieren Sie es als String-Variablen.

ZB:

void fun() 
{ 
    string str, str1 = 'a', str2 ='b'; 
    str += str1 + str2 

    cout << str; 
} 

ODER

void fun() 
{ 
    string str; 
    str += string("a") + 'b'; 

    cout << str; 
} 
+0

'' str + = "a" + "b"; '' - Sie fügen hier 2 Zeiger, nicht Strings. –

+0

Oh ja! Danke für den Tipp. :-) –

+1

'std :: string' hat keine Konstruktoren mit einem' char' Parameter. – soon

3

Wie Sie in der Regel Strings im Code setzen?

string str = "qaz123"; 

können Sie tun

str = str + " another string" 

die (theoretisch, in der Praxis kann es sein, etwas) ein Äquivalent

str += " another string" 

können Sie verwenden

str += 'a' 

weil da ist ein Operator überladen Zeichentyp

Sie versuchen zu tun:

str += 'a' + 'b' 

diese App Versuchen:

#include <typeinfo> 
#include <iostream> 

int main(void) 
{ 
    std::cout << typeid('a').name() << std::endl; 
    std::cout << typeid('a'+'b').name() << std::endl; 
} 

Das Ergebnis wird wie folgt aussehen:

c 
i 

Was bedeutet, dass 'a'+'b' auf eine ganze Zahl auswertet.

Nun ist die Frage: welcher Operator tatsächlich aufgerufen wird, wenn Sie str += 'a'+'b' tun.

Höchstwahrscheinlich wird der Operator char mit dem Zeichenwert 195 aufgerufen.

In meinem System ist 195 char . Was ist das für dich?

2

str + = 'a' + 'b'; Wenn dies ausgeführt wird, ist der einzelne Operator '+' vor dem komplexen Operator '+ =', so berechnet er zuerst die Summe von zwei Zeichensymbolen und das Summenergebnis ist 195 (ASCII-Wert von 'a' ist 97, 'b' ist 98), führen Sie dann den Überladungsoperator '+' der Klassenzeichenfolge aus. Verfolgen Sie in die Funktion, Sie werden feststellen, dass es nur das Argument char akzeptiert, also wird es in ein char mit dem Wert -61 übersetzt (195-256 == - 61). aber es ist ein unbedrucktes Symbol, also ist das Ergebnis 0 bis zum Ende. Natürlich können Sie beim Design keine neue Zeichenfolge erhalten.

können Sie wie folgt neu codieren:

string str; 
str += 'a'; 
str += 'b'; 
+1

+1, aber ein paar kleine Punkte: Es ist die Implementierung definiert, ob 'char' ist signiert oder unsigniert, so dass der Wert 195 oder -61 sein könnte; "Es ist ein unbedrucktes Symbol, also ist das Ergebnis 0 bis zum Ende" - tatsächlich speichert die Zeichenkette glücklich den Wert 195/-61 und besetzt ein einzelnes Zeichen bei 'str [0]' mit 'str.size()' jetzt 1. 'std :: string' kann verwendet werden, um beliebigen binären Inhalt, einschließlich NULs, zu speichern, was gelegentlich bequem ist. Manche Leute bevorzugen es, einen 'std :: vector ' oder 'std :: vector ' zu benutzen, wenn sie das wollen, obwohl sie die Schnittstelle 'vector' oder als Dokumentation haben wollen. –

+0

Danke für Ihre Kenntnisnahme. Du hast recht – DarkHorse