Почему я получаю ноль на выходе? - PullRequest
0 голосов
/ 05 октября 2019

Итак, я пытаюсь поменять два числа без использования третьей переменной. Я передаю два числа, которые я пытаюсь поменять местами по ссылке. Когда нужно поменять одно и то же число (например, 1 заменить на 1), я получаю ноль. Я знаю, как это исправить, но я не могу понять, почему я продолжаю получать 0, когда a и b совпадают.

Может кто-нибудь объяснить, почему я получаю ноль вместо поменянных чисел?

void swap(int *a,int *b)
{
        //if(a==b)
        //      return;
        *a=*a+*b;
        *b=*a-*b;
        *a=*a-*b;
}
int main()
{
    int n=3,x=0,y=0;
    int a[n][n];
    for(int i=0;i<n;i++)
                swap(&a[x][i],&a[i][y]);
    return 0;
}

Ответы [ 2 ]

4 голосов
/ 05 октября 2019

Кажется, вы пытаетесь поменять местами элементы первого ряда с элементами первого столбца.

Для начала массивы переменной длины не являются стандартной функцией C ++. Хотя некоторые компиляторы имеют свои собственные языковые расширения, вам следует избегать их использования.

Кроме того, функция swap может иметь неопределенное поведение, поскольку при переполнении целого числа со знаком результат не определен. Лучше использовать стандартную функцию C ++ std::swap. И в вашей программе вы используете неинициализированный массив.

Вот демонстрационная программа, которая показывает, как вы могли бы написать код

#include <iostream>
#include <utility>

int main() 
{
    const size_t N = 3;
    int a[N][N];

    for ( size_t i = 0; i < N; i++ )
    {
        for ( size_t j = 0; j < N; j++ )
        {
            a[i][j] = i * N + j;
        }
    }

    for ( const auto &row : a )
    {
        for ( const auto &item : row )
        {
            std::cout << item << ' ';
        }
        std::cout << '\n';
    }

    std::cout << '\n';

    for ( size_t i = 0; i < N; i++ )
    {
        std::swap( a[0][i], a[i][0] );
    }

    for ( const auto &row : a )
    {
        for ( const auto &item : row )
        {
            std::cout << item << ' ';
        }
        std::cout << '\n';
    }

    std::cout << '\n';

    return 0;
}

Его вывод

0 1 2 
3 4 5 
6 7 8 

0 3 6 
1 4 5 
2 7 8 

Если вы хотите написать свою собственную функцию подкачки, напишите ее как

void swap( int *a, int *b )
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

и используйте ее в программе, например

::swap( &a[0][i], &a[i][0] );
0 голосов
/ 05 октября 2019

Насколько я понял твой код. Вы пытаетесь поменять элементы первой строки с соответствующими элементами в первом столбце. Вы получаете 0 в позиции a [0] [0] в матрице. Причина проста ... Посмотрите на эти шаги в вашем коде * b = * a- * b;* А = * а- * Ь;Вы вычитаете то же самое из этого значения. Очевидно, что результат будет 0. И да, идея поменять строку с колонкой действительно креативна ???

...