为什么我的输出为零?
Why am I getting zero in the output?
所以我试图在不使用第三个变量的情况下交换两个数字。我传递了我试图通过引用交换的两个数字。当要交换相同的数字时(例如 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++ 功能。尽管某些编译器有自己的语言扩展,但您应该避免使用它们。
交换函数也可能有未定义的行为,因为当有符号整数溢出时,结果是未定义的。最好使用标准的 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
如果你想写自己的swap函数就这样写
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。
是的,交换行和列的想法真的很有创意
所以我试图在不使用第三个变量的情况下交换两个数字。我传递了我试图通过引用交换的两个数字。当要交换相同的数字时(例如 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++ 功能。尽管某些编译器有自己的语言扩展,但您应该避免使用它们。
交换函数也可能有未定义的行为,因为当有符号整数溢出时,结果是未定义的。最好使用标准的 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
如果你想写自己的swap函数就这样写
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。 是的,交换行和列的想法真的很有创意