C++ 为什么我的输出为零?

C++ 为什么我的输出为零?,c++,arrays,swap,C++,Arrays,Swap,所以我尝试在不使用第三个变量的情况下交换两个数字。我通过引用传递我试图交换的两个数字。当相同的数字被交换时(就像1被1交换),我得到的输出是零。我知道如何解决这个问题,但我无法理解为什么当a和b相同时我总是得到0 有人能解释为什么我得到的是零而不是交换的数字吗 void swap(int *a,int *b) { //if(a==b) // return; *a=*a+*b; *b=*a-*b; *a=*a

所以我尝试在不使用第三个变量的情况下交换两个数字。我通过引用传递我试图交换的两个数字。当相同的数字被交换时(就像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;
}
无效交换(int*a,int*b)
{
//如果(a==b)
//返回;
*a=*a+*b;
*b=*a-*b;
*a=*a-*b;
}
int main()
{
int n=3,x=0,y=0;
INTA[n][n];

对于(inti=0;i,您似乎正在尝试将第一行的元素与第一列的元素交换

对于可变长度的数组,初学者不是标准的C++特性。虽然有些编译器有自己的语言扩展,但是应该避免使用它们。

也可以交换函数有不确定的行为,因为当有符号整数溢出时,结果是未定义的。最好使用标准C++函数<代码> STD::SWIFT/COD>。 在您的程序中,您使用的是未初始化的数组

下面是一个演示程序,演示如何编写代码

#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;
}
如果你想写你自己的交换函数,那就这样写吧

void swap( int *a, int *b )
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}
并在程序中使用它,如

::swap( &a[0][i], &a[i][0] );

据我所知,您的代码。您正在尝试将第一行元素与其在第一列中对应的元素交换。。 您在矩阵中的位置a[0][0]处得到0。 原因很简单。。 请在代码中查看这些步骤 *b=*a-*b; *a=*a-*b; 您正在从该值中减去相同的值。。 显然结果是0。
yeh用列交换行的想法真的很有创意
inta[n][n]从C++代码中读取值。从代码< C++ >代码中读取值会导致未定义的行为,你认为代码“<代码> <代码>包含什么?@ U.WATT代码没有意义。你想做什么?这是无关的:你没有通过引用传递值。你是PASIN。g按值指针。要按引用传递值,您可以使用
void swap(int&a,int&b)
代替。请尝试
int a[3][3]={{{1,2,3},{4,5,6},{7,8,9};
代替
int a[n][n];
::swap( &a[0][i], &a[i][0] );