【问题标题】:Why isn't this reverse algorithm working?为什么这个反向算法不起作用?
【发布时间】:2015-10-08 16:24:00
【问题描述】:
#include <iostream>

void intswap ( int * pa, int * pb )
{
    int temp = *pa;
    *pa = *pb; 
    *pb = temp;
}

void reverse ( int * arr, size_t n )
{
    int * end = arr + n;
    while (arr != end && arr != --end) intswap(arr++,end);
}

int main ( )
{
    int myArray [] = {1, 69, 0, -123, 1377};
    size_t n = sizeof(myArray)/sizeof(int);
    reverse(myArray, sizeof(myArray, n));
    for ( size_t i = 0; i < n; ++i ) std::cout << myArray[i] << " ";

    return 0;
}

生产

-123 0 69 1 1377

我做错了什么?毕竟,它与这里看到的算法相同:http://www.cplusplus.com/reference/algorithm/reverse/

【问题讨论】:

  • sizeof(myArray, n)???
  • sizeof(myArray, n) 这是 C++ 吗?它不会在 C 中编译。
  • 哈哈哎呀。类型-o。
  • 听起来您可能需要学习如何使用调试器来单步调试您的代码。使用好的调试器,您可以逐行执行您的程序,并查看它与您期望的偏差在哪里。如果您要进行任何编程,这是必不可少的工具。进一步阅读:How to debug small programs
  • sizeof 是一个运算符,, 也是一个运算符,所以sizeof(a, b) 等于sizeof(b) 所以sizeof(size_t) 在你的例子中(4 个字节可能)

标签: c++ algorithm


【解决方案1】:

您的问题是,由于逗号运算符 sizeof(myArray, n)sizeof(n) 完全相同,在您的情况下显然是 4 个字节。您可能只想说n

【讨论】:

    【解决方案2】:

    Mark B 已经指出了您代码中的问题。这是提高代码可读性的建议。您可以将reverse 更改为:

    void reverse ( int * arr, size_t n )
    {
       int * end = arr + n;
       while ( arr < end )
       {
          --end;
          intswap(arr, end);
          ++arr;
       }
    }
    

    使其更具可读性。

    【讨论】:

    • 显然,我的建议并没有提高某些人的可读性:) :)
    • 您的答案与问题无关,在某些方面可读性是主观的。这是其中之一
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    相关资源
    最近更新 更多