сравнивая строки внутри условных, не объявляя их как строки

0

следующее условие явно ложно

   string e = "English", c = "Chemistry";
   if (e < c) ... // this is False

но верно, независимо от любого порядка:

  if("English" < "Chemistry") ...//True

  if("Chemistry" < "English") ... //also True

почему он ведет себя так? Я не понимаю, как эти два условия могут быть истинными.

Теги:
string-comparison

3 ответа

0

Это значение указателей сравнивается. Так что это зависит от компилятора.

Вам нужно использовать strcmp или операторы сравнения для строк.

0

Строковые литералы - это просто "C-строка", то есть указатель на char. Поскольку они являются указателями, вы можете использовать на них некоторые арифметические операторы, но если вы запускаете свою программу на разных машинах или просто несколько раз, вы можете получить разные ответы.

Если вы хотите сравнить две std::string, вы можете использовать что-то в этих строках:

if (std::string("English") < "Chemistry")

Обратите внимание, что по крайней мере на строке должна быть std::string.

0

"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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню