Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当M是奇数时,若它在对角线中间,则在对角线交换后显示为零_C++_Arrays_Matrix_Diagonal - Fatal编程技术网

C++ 当M是奇数时,若它在对角线中间,则在对角线交换后显示为零

C++ 当M是奇数时,若它在对角线中间,则在对角线交换后显示为零,c++,arrays,matrix,diagonal,C++,Arrays,Matrix,Diagonal,如果M的值为3,并且如果mat[1][1]处的值为5, 然后将mat[1][1]与mat[1][1]互换后,应仍然为5, 但它却显示为0。 但是当M是偶数时,代码工作得很完美 #include<iostream> #define M 3 void swap( int &a, int &b ) { a=a+b; b=a-b; a=a-b; } using namespace std; int main() { i

如果M的值为3,并且如果mat[1][1]处的值为5, 然后将mat[1][1]与mat[1][1]互换后,应仍然为5, 但它却显示为0。 但是当M是偶数时,代码工作得很完美

#include<iostream>
#define M 3
void swap( int &a, int &b )
{
        a=a+b;
        b=a-b;
        a=a-b;
}

using namespace std;
int main()
{
    int mat[M][M];
    cout<<"Enter "<<M<<"x"<<M<<" matrix"<<endl;
    for( int i=0; i<M; i++ )
        for( int j=0; j<M; j++ )
            cin>>mat[i][j];


    cout<<endl<<"The real matrix"<<endl;
    for( int i=0; i<M; i++ )
        {
            for( int j=0; j<M; j++ )
            {
                cout<<mat[i][j]<<"\t";
            }
            cout<<endl;
        }


    for( int i=0; i<M; i++ )
    {
        swap( mat[i][i], mat[i][M-i-1] );
    }


    cout<<endl<<"The matrix after diagonal interchange "<<endl;
    for( int i=0; i<M; i++ )
        {
            for( int j=0; j<M; j++ )
            {
                cout<<mat[i][j]<<"\t";
            }
            cout<<endl;
        }

    return 0;
}
#包括
#定义m3
无效掉期(内部和a、内部和b)
{
a=a+b;
b=a-b;
a=a-b;
}
使用名称空间std;
int main()
{
int mat[M][M];

cout这背后的原因是在swap()函数中通过引用传递值

假设M[1][1]=5

当您将M[1][1]传递给swap()时,它们不会被复制到a和b。相反,a和b将成为M[1][1]的别名

让我们试着一步一步地了解正在发生的事情:

a=a+b; // equivalent to M[1][1] = M[1][1] + M[1][1];
执行此操作后,M[1][1]将变为10。因为a&b是M[1][1]的别名,所以a和b也将变为10

b=a-b; // equivalent to M[1][1] = M[1][1] - M[1][1];
执行此操作时,M[1][1]变为0。因为a&b是M[1][1]的别名,所以a和b也变为0

a=a-b; // equivalent to M[1][1] = M[1][1] - M[1][1];
执行此操作时,M[1][1]变为0。因为a&b是M[1][1]的别名,所以a和b也变为0

a=a-b; // equivalent to M[1][1] = M[1][1] - M[1][1];
编辑:

正如@SidS所建议的,您可以使用库函数
std::swap()
。如果要更正代码,只需使用以下命令更改swap():

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

问题是,您正在为
swap()
函数的两个参数传递相同的值,
mat[1][1]
。您的
swap()
函数不能正确处理这种情况,因为对
a
的任何更改也会应用于
b
,反之亦然

相反,请使用
std::swap()


如何交换值?@SidS在这种情况下使用临时变量是一个更好的选择。我同意,但按引用传递不是问题。有必要按引用传递。@SidS是的。您必须按引用传递,但在没有临时变量的情况下不应这样做。@SidS,问题是因为值但根据要求,我们别无选择,只能通过引用。
void swap(int &a, int &b)
{
    auto c = a;
    a = b;
    b = c;
}