2014-01-03 3 views
0
char a[1][2]; 
char b[1][2]; 

a[0][0] = 'a'; 
a[0][1] = 'b'; 
b[0][0] = 'a'; 
b[0][1] = 'b'; 

if(a[0] == b[0]){ 
    cout << "worked\n"; 
} 

Насколько я могу судить, это сравнение между массивами персонажей не работает так, как вы ожидали. Оператор if не выполняется, потому что условие a == b возвращает false. Почему это?Почему это сравнение между массивами символов не работает?

+8

Вы сравниваете адреса памяти ... Они представляют собой ОЧКИ. – opalenzuela

+0

адреса памяти различны для массивов a и b. – CreativeMind

+0

Исправление: они ** распадаются ** на указатели. В любом случае, это было унаследовано от C. Для кода, который больше похож на C++, используйте 'std :: string'. – chris

ответ

5

В этом заявлении

if(a == b){ 
    cout << "worked\n"; 
} 

а и б неявно преобразуются в указатели на первые элементы соответствующих массивов. Таким образом, существует сравнение двух указателей. Поскольку массивы занимают разные области памяти, тогда условие будет равным ложному.

Нет такой операции, как сравнение для массивов. Чтобы сравнить два массива, вы должны сравнить все элементы массивов друг с другом. Например, вы можете использовать стандартный алгоритм std :: equal. Например,

if(std::equal(std::begin(a), std::end(a), std::begin(b))){ 
    cout << "worked\n"; 
} 

Другой подход заключается в использовании стандартного контейнера std :: array, который имеет оператор сравнения. Например,

std::array<char, 2> a = { 'a', 'b' }; 
std::array<char, 2> b = { 'a', 'b' }; 

    if(a == b){ 
     cout << "worked\n"; 
    } 
+0

Я рассматривал a и b как одномерные массивы в выражении в выражении с помощью std :: equal. В противном случае код будет более сложным. –

4

Вы не можете сравнивать такие массивы. Вам нужно перебирать массивы и сравнивать каждую пару элементов по очереди. Альтернативно (и предпочтительно) заменить статический массив на std::vector. Код, который вы видите, сравнивает указатели a и b которые, разумеется, не равны.

+0

Так будет ли сравнение, если (* a [0] == * b [0]) работает так, как ожидалось? Есть ли недостаток в использовании этого метода? – user3150601

+0

@ user3150601 Нет, это не сработает, и это главный недостаток. –

+0

Я отредактировал код и мой вопрос, делает ли это утонченную работу? – user3150601

Смежные вопросы