следующее условие явно ложно
string e = "English", c = "Chemistry";
if (e < c) ... // this is False
но верно, независимо от любого порядка:
if("English" < "Chemistry") ...//True
if("Chemistry" < "English") ... //also True
почему он ведет себя так? Я не понимаю, как эти два условия могут быть истинными.
Это значение указателей сравнивается. Так что это зависит от компилятора.
Вам нужно использовать strcmp
или операторы сравнения для строк.
Строковые литералы - это просто "C-строка", то есть указатель на char. Поскольку они являются указателями, вы можете использовать на них некоторые арифметические операторы, но если вы запускаете свою программу на разных машинах или просто несколько раз, вы можете получить разные ответы.
Если вы хотите сравнить две std::string
, вы можете использовать что-то в этих строках:
if (std::string("English") < "Chemistry")
Обратите внимание, что по крайней мере на строке должна быть std::string
.
"English"
имеет тип const char[]
, который распадается на тип char const *
: то есть он фактически является указателем на ячейку памяти, в которой хранится исходный E
Когда вы пишете
string e = "English"
вы неявно вызываете конструктор преобразования, определенный string
типа, который принимает char *
и создает string
:
string e("English")
и в этой точке e < c
эквивалентно e.operator<(c)
, который фактически вызывает string.operator<
и выполняет сравнение строк.
Но когда вы сравниваете "English"
и "Chemistry"
напрямую, у вас нет никаких string
объектов, поэтому вы на самом деле просто сравниваете указатели - ячейки памяти - и результаты непредсказуемы. Вместо этого вам нужно использовать стандартную функцию strcmp
:
strcmp("English", "Chemistry") < 0 // false: English is not less than Chemistry