Этот оператор
str += temp + "bc";
может быть представлен как
str = str + ( temp + "bc" )
;
В подвыражении temp + "bc"
строковый литерал "bc"
неявно преобразован в указатель на свой первый символ и имеет тип const char *
. Значение переменной temp
преобразуется в целочисленный тип из-за целочисленных переходов, которые, например, в таблице ASCII имеют значение 97
.
Таким образом, в подвыражении используется арифметика указателя c. Выражение temp + "bc"
указывает на память вне строкового литерала. Таким образом, результат выражения не определен.
Если вы напишите, например,
char temp = 1;
, тогда выражение temp + "bc"
указывает на второй символ строкового литерала. В результате str
будет иметь значение 'b'
.
Или для получения того же результата, что и во второй программе, вы можете написать
str += temp + std::string( "bc" );
Что касается второй программы, то в В этом операторе
str += temp;
str += "bc";
используются перегруженные операторы +=
для класса std :: string и объектов типа char
и char *
. Так что эти утверждения четко определены.
Обратите внимание на то, что вы должны явно включить заголовок <string>
.
#include <string>