2016-04-12 44 views
5

Pozwólcie mi pokazać wam mój pierwszy kod:Dlaczego zwracam nieznaną wartość, gdy dodałem znak do pustego łańcucha (jako "" + 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; 
} 

Spodziewałem wyjście jest:

$ --- rozmiar: 1

$ --- rozmiar: 1

Ale rzeczywistą wydajnością w stosunku do vs2013 jest:

$ --- rozmiar: 1

--- rozmiar: 0

Jest to ciekawe zjawisko, a ja zastanawiam się, dlaczego tak dziwnie?

uwaga: jeśli kod string str = "";, wtedy str == "" zwróci true.

+0

Jest rzeczywiście ostrzeżenie wydane na ten temat: [_'main.cpp: 12: 8: ostrzeżenie: Offset poza granice stałej string'_] (http://coliru.stacked-crooked.com/a/5180c0f835abc759). –

Odpowiedz

8

W str = "" + c;, "" nie jest std::string, to string literal z rodzaju const char[], a następnie rozpad do const char* i "" + c staje wskaźnik arytmetyka.

W tym przypadku, ponieważ c ma wartość dodatnią, "" + c doprowadzi do UB, co oznacza, że ​​wszystko jest możliwe. Może mieć szczęście (lub pecha), ponieważ program się nie psuje.

I jak wskazano @ tobi303, wyraźna konwersja na std::string rozwiąże problem.

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

... I masz szczęście, że coś nie spadło na –

+2

, czy nie 'str = std :: string (" ") + c;' napraw problem? – user463035818

+0

@ tobi303 Dobry punkt. – songyuanyao