【问题标题】:Why am I getting zero in the output?为什么我的输出为零?
【发布时间】:2020-02-03 11:33:21
【问题描述】:

所以我试图在不使用第三个变量的情况下交换两个数字。我通过了我试图通过引用交换的两个数字。当要交换相同的数字时(例如将 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[n][n]; 不是有效的 C++。 C++ 不支持变长数组。您没有初始化数组。从 a 读取值会导致未定义的行为
  • 你认为a包含哪些数字?
  • @U.瓦特 代码没有意义。你想做什么?
  • 这无关:您没有通过引用传递值。您正在按值传递指针。要通过引用传递值,您可以改用void swap(int &amp;a,int &amp;b)
  • 尝试int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}}; 而不是int a[n][n];

标签: c++ arrays swap


【解决方案1】:

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

对于初学者来说,可变长度数组不是标准的 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] );

【讨论】:

    【解决方案2】:

    据我了解您的代码。您正在尝试将第一行元素与其第一列中的相应元素交换.. 您在矩阵中的位置 a[0][0] 处得到 0。 原因很简单。。 在您的代码中查看此步骤 *b=*a-*b; *a=*a-*b; 您正在从该值中减去相同的值.. 显然结果将为0。 是的,将行与列交换的想法非常有创意???

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-19
      • 2018-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多