Две строки с (почти) одинаковыми значениями возвращают 0 или 1 при сравнении на равенство (они отличаются на символ '\ 0') - PullRequest
0 голосов
/ 25 апреля 2020

В следующем коде:

string x="test";
string y="test";
y += '\0';
cout << (x==y) << endl;

печатает:

0

Но, тот же код с небольшим изменением:

string x="test";
string y="test";
y += "\0";
cout << (x==y) << endl;

отпечатки:

1

Вопросы:

  1. Почему это так?

  2. Как реализовано operator==? Проверяет ли он каждый символ или игнорирует '\0'?

  3. Я читал, что строки C ++ не заканчиваются нулем. В проверке я сделал о существовании символа '\0' в обычном строковом литерале, я получил 1. Это неопределенное поведение?

1 Ответ

1 голос
/ 25 апреля 2020

'\0' представляет собой одиночный char с порядковым значением 0. operator+=(char) добавляет any char к строке независимо от ее значения. Сравнив y.size() до и после добавления, вы увидите, что размер увеличивается на 1.

"\0" - строковый литерал, a const char[2], содержащий два нулевых символа, один явный вами и один неявный компилятором. Когда operator+=(const char*) рассматривается как строка с нулевым окончанием в стиле C, ее логическая длина останавливается на первом нулевом символе, следовательно, ее длина равна нулю. Сравнивая y.size() до и после добавления, вы увидите, что размер не меняется.

operator== учитывает size(). Две строки разных размеров вернут false. Две строки одинакового размера будут сравнивать все свои char с, включая встроенные нулевые символы.

...