C ++ Char - реляционные операторы - PullRequest
0 голосов
/ 10 февраля 2019

У меня небольшая проблема при работе с char в C ++, так как я пытался сравнить 2 текста в случае, если есть то, что у меня есть:

Ввод:

if ( "bac" < "ab" ) cout<<"1";
if ( "ab" > "bac" ) cout<<"1";

Вывод:

11

Я не очень понимаю, почему он печатает «11», но, более того, если я удалю первое «если», это не будетбольше печатать что-нибудь на экране.Не могли бы вы объяснить, почему у этих IF есть такое поведение?

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019
`if("abc" < "bcd" );

Это эквивалентно:

char* a= "abc";
char* b ="bcd";
if( a < b );

a и b - указатели, адреса в памяти.Поэтому независимо от того, что находится в двух строках, они находятся в разных местах памяти.Это означает, что независимо от содержимого двух строк, a никогда не будет равным b.

Когда вы "abc", вы получаете место в памяти этой строки.Вот что подразумевается под " Вы сравниваете указатели. ";C ++ не похож на другие языки, где machine абстрагируется.Вы работаете с реальными единицами и нулями, которые использует машина.И все живет где-то в памяти.

strcmp - это функция, которая берет два указателя, а затем сравнивает значения в ячейке памяти, на которую ссылаются эти указатели.

if( ! strcmp(a,b) )
   ;//then the two strings are the same
0 голосов
/ 11 февраля 2019

Вы сравниваете указатели, а не символы.

Если вы используете современный компилятор, вы можете сделать это следующим образом:

if ("bac"s < "ab"s) cout << "1";
if ("ab"s > "bac"s) cout << "1";

Суффикс s сообщает компиляторучто строковые литералы имеют тип std::string.


Если ваш компилятор не поддерживает это, вы можете сделать это по старинке:

if (string("bac") < string("ab")) cout << "1";
if (string("ab") > string("bac")) cout << "1";

Или древний способ в стиле C:

if (strcmp("bac, "ab") < 0) cout << "1";
if (strcmp("ab, "bac") > 0) cout << "1";
...