В чем разница между "some" == "some \ 0" и strcmp ("some", "some \ 0") в c ++? - PullRequest
1 голос
/ 16 июля 2011

В чем разница между "some" == "some\0" и strcmp("some","some\0") в c ++?

Почему if("some" == "some\0") возвращает false и if(!strcmp("some","some\0")) возвращает true?

Ответы [ 3 ]

9 голосов
/ 16 июля 2011
"some" == "some\0" 

сравнивает строковые литералы по их адресам.Эти литералы хранятся в разных местах памяти .Поэтому всегда false.

!strcmp("some","some\0")

сравнивает содержимое строк.Таким образом, в этом контексте "some\0" совпадает с "some".Итак true.

Редактировать : Из ваших комментариев вы спрашиваете, почему "some" == "some" равно true.Это потому, что в основном компилятор достаточно умен, чтобы повторно использовать строковый литерал (когда они хранятся в только для чтения регионе).Вот почему он возвращает true.

PS. В нижеследующем случае «some» не сохраняется только для чтения:

char a[] = "some";
5 голосов
/ 16 июля 2011

См. Следующую диаграмму. Он показывает две строки в памяти, их содержимое находится в поле, рядом с полем вы увидите адрес каждой из них.

string content and addresses

Когда вы делаете if("some" == "some\0"), вы сравниваете адреса. Оно переведено на if (0xdeadbeef == 0x0badcafe), что явно неверно.

Когда вы используете strcmp, вы сравниваете содержимое каждого поля, пока не достигнете \0 в каждом из них. Вот почему второй тест возвращает true.

Если вы измените первый тест на if("some" == "some"), тогда компилятор may potentially увидит, что это одинаковые строки, и сохранит их только один раз. Это означает, что ваш тест превратится в if (0x0badcafe == 0x0badcafe), что, очевидно, верно.

2 голосов
/ 16 июля 2011

Тип "some" равен const char*, поэтому при сравнении "some"=="some\0" вы сравниваете два const char* указателя. Поскольку они могут не указывать на одно и то же место в памяти, сравнение обычно не выполняется. Во втором случае вы используете strcmp, который сравнивает строки, просматривая отдельные символы в строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...