为什么我的输出为零?

问题描述 投票:0回答:1

因此,我尝试不使用第三个变量就交换两个数字。我传递了两个我想通过引用交换的数字。当要交换相同的数字时(例如将1与1交换),我得到的输出为零。我知道如何解决此问题,但我无法理解为什么当a和b相同时我总是得到0。

有人可以解释为什么我得到零而不是交换的数字吗?

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;
}
c++ arrays swap
1个回答
0
投票

似乎您正在尝试将第一行的元素与第一列的元素交换。

对于初学者,可变长度数组不是标准的C ++功能。尽管某些编译器具有自己的语言扩展,但您应避免使用它们。

此外,交换函数可能具有未定义的行为,因为当有符号整数溢出时,结果是不确定的。最好使用标准的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] );
© www.soinside.com 2019 - 2024. All rights reserved.