См. Следующую диаграмму. Он показывает две строки в памяти, их содержимое находится в поле, рядом с полем вы увидите адрес каждой из них.
Когда вы делаете if("some" == "some\0")
, вы сравниваете адреса. Оно переведено на if (0xdeadbeef == 0x0badcafe)
, что явно неверно.
Когда вы используете strcmp
, вы сравниваете содержимое каждого поля, пока не достигнете \0
в каждом из них. Вот почему второй тест возвращает true.
Если вы измените первый тест на if("some" == "some")
, тогда компилятор may potentially
увидит, что это одинаковые строки, и сохранит их только один раз. Это означает, что ваш тест превратится в if (0x0badcafe == 0x0badcafe)
, что, очевидно, верно.