#c #algorithm #boolean #equality #function-definition
#c #алгоритм #логическое #равенство #функция-определение
Вопрос:
Я хотел сравнить два массива. Я установил переменную как true, и она получает false, когда какой-либо элемент в массиве не совпадает. Я хочу вернуть эту переменную, которая является логическим значением, но она не возвращает его. Почему это так?
bool compare_arr(int arr1[], int len_arr1, int arr2[] ,int len_arr2){
cout << "Compare the two Arrays"<< endl;
bool result = true;
for(int x = 0; x < len_arr1; x )
{
if(arr1[x]==arr2[x])
{
continue;
}
else
{
result = false;
break;
}
}
return resu<
}
int main()
{
int arr1[] = {1,2,3,4};
int len_arr1 = sizeof(arr1)/sizeof(arr1[0]);
int arr2[] = {1,2,3,4};
int len_arr2 = sizeof(arr2)/sizeof(arr1[0]);
compare_arr(arr1,len_arr1,arr2,len_arr2);
return 0;
}
Комментарии:
1. но это не возвращает это. Откуда вы знаете, что возвращает функция, если вы не используете результат
compare_arr
?2.Функция
compare_arr()
возвращает abool
. Однакоmain()
не использует возвращаемый результат (например, сохранение возвращаемого значения в переменной, сравнение его с другим значением). Если вы хотите использовать возвращаемое значение вmain()
, то вам нужно явно это сделать — это не происходит по волшебству.3. Уже пробовал отладку? Каковы были ваши выводы?
4. Часто a
continue
можно устранить, переписав код, что делает его более понятным.for (int x = 0; x < len_arr1; x ) { if (arr1[x] != arr2[x] { result = false; break; } }
. Я был бы склонен также удалитьbreak
:for (int x = 0; x < len_arr1; x ) { if (arr1[x] != arr2[x] { return false; } } return true;
Ответ №1:
Вы не используете возвращаемое значение вызова функции
compare_arr(arr1,len_arr1,arr2,len_arr2);
Вы могли бы, например, написать
std::cout << compare_arr(arr1,len_arr1,arr2,len_arr2) << 'n';
или
#include <iomanip>
//...
std::cout << std::boolalpha << compare_arr(arr1,len_arr1,arr2,len_arr2) << 'n';
Но в любом случае ваша функция может вызывать неопределенное поведение в случае, когда количество элементов в массивах разное.
Функцию можно написать проще, используя стандартный алгоритм std::equal
. Например
#include <algorithm>
//...
bool compare_arr( const int arr1[], size_t len_arr1, const int arr2[], size_t len_arr2 )
{
return std::equal( arr1, arr1 len_arr1, arr2, arr2 len_arr2 );
}
Обратите внимание на то, что тип результата выражения с sizeof
оператором является size_t
. Итак, вы должны написать, например
size_t len_arr1 = sizeof(arr1)/sizeof(arr1[0]);
^^^^^^
Соответственно, параметры функции, определяющие количество элементов в массивах , также должны иметь тип size_t
.
Если вы не можете использовать стандартные алгоритмы, то функция может быть объявлена и определена следующим образом
bool compare_arr( const int arr1[], size_t len_arr1, const int arr2[], size_t len_arr2 )
{
bool result = len_arr1 == len_arr2;
for ( size_t i = 0; result amp;amp; i < len_arr1; i )
{
result = arr1[i] == arr2[i];
}
return resu<
}
Ответ №2:
Как писал Дэвид, вы игнорируете возвращаемое значение. Вам нужно присвоить возвращаемое значение переменной, чтобы использовать его.
const bool compare_result = compare_arr(arr1,len_arr1,arr2,len_arr2);
Замечания по стилю кодирования:
Вы должны исправить свой цикл, так как вы используете только длину первого массива, но если второй массив будет меньше, вы получите ошибку seg.
И поскольку вы обозначили вопрос как C , подумайте об использовании std::vector вместо массивов c.