Как вернуть логическое значение в функции?

#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() возвращает a bool . Однако 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.