2016-04-12 27 views
5

Permettetemi di mostrarvi il mio codice prima:Perché restituire un valore sconosciuto quando ho aggiunto un char alla stringa null (come "" + c)?

void testStringAdd(){ 
    char c = '$'; 
    string str = ""; 
    str += c;//the same as `str = str + c;` 
    cout << str << "---"; 
    cout << "size : " << str.size() << endl; 
    str = "" + c;//the same as `str = c + ""`; 
    cout << str << "---"; 
    cout << "size : "<< str.size() << endl; 
} 

mi aspettavo l'uscita è:

$ --- formato: 1

$ --- formato: 1

Ma la vera uscita sul vs2013 è:

$ --- formato: 1

--- formato: 0

Questo è un fenomeno interessante, e mi chiedo perché è così strano?

nota: Se codice string str = ""; allora str == "" restituirà true.

+0

In realtà c'è un avvertimento emesso su questo: [_'main.cpp: 12: 8: avvertimento: offset limiti esterni della costante string'_] (http://coliru.stacked-crooked.com/a/5180c0f835abc759). –

risposta

8

In str = "" + c;, "" non è std::string, è una string literal con tipo const char[], e poi decadimento di const char* e "" + c diventa aritmetica dei puntatori.

In questo caso, poiché c ha un valore positivo, "" + c porterà a UB, il che significa che tutto è possibile. Potrebbe essere fortunato (o sfortunato) per te il programma non si blocca.

E come indicato da @ tobi303, una conversione esplicita a std::string risolverà il problema.

str = std::string("") + c; 
+1

... E sei fortunato che la cosa non sia caduta oltre –

+2

wont 'str = std :: string (" ") + c;' risolve il problema? – user463035818

+0

@ tobi303 Buon punto. – songyuanyao