【问题标题】:bubble sort algorithm for loop statement warning循环语句警告的冒泡排序算法
【发布时间】:2014-04-17 13:17:52
【问题描述】:

我看到一段冒泡排序代码,最初我认为代码是错误的。但是在编译运行之后,令我惊讶的是它确实有效。我想知道第一个 for 循环中的第二个语句为什么不是条件而是赋值。另外,这段代码怎么不会无限循环呢?

PS:它会产生一个警告:“建议在赋值周围使用括号作为真值 [-W括号]”抱怨第一个 for 循环。令人惊讶的是,这不是错误。

#include <iostream>

void bubblesort(int A[], int n)
{
    for (bool sorted = false; sorted = !sorted; n--)
    {
        for (int i = 1; i < n; ++i)
        {
            if (A[i-1] > A[i])
            {
                int tmp = 0;
                tmp = A[i];
                A[i] = A[i-1];
                A[i-1] = tmp;
                sorted = false;
            }
        }
    }
}

int main()
{
    int a[5] = {1,4,5,2,3};

    bubblesort(a, 5);

    for (unsigned int i = 0; i < 5; ++i)
    {
        std::cout << a[i] << std::endl;
    }

    return 0;
}

【问题讨论】:

  • 虽然结果很有趣......永远不要使用它。
  • 不可读但有效的代码,与 `if (sorted = !sorted) 相同。当您在“if”语句中误用“=”和“==”时,您将错过“安全警告”。
  • 在我看来 100% 洁净。在我处理的代码中,条件内的赋值非常常见。

标签: c++ algorithm sorting bubble-sort


【解决方案1】:

赋值的结果是左操作数,所以条件

sorted = !sorted

在分配新值后使用sorted 作为条件。警告是为了提醒您使用赋值作为条件有时不是您所期望的。你可以使用

(sorted = !sorted) == true

使警告静音。

【讨论】:

    【解决方案2】:

    C 和 C++ 的怪癖之一是它们允许在语句中间进行赋值。通常这是一个错误(= 而不是==),所以一个好的编译器会警告你。

    这样一个表达式的值与赋值相同。

    在这种情况下,这是一个非常棘手的优化;如果值为假,则将其重置为真并继续循环,如果为真则变为假并满足循环终止条件。我永远不会在任何人都应该维护的代码中使用它。

    【讨论】:

      【解决方案3】:

      代码说明。基本上,如果 sorted ever 是 true before,则循环将停止。

      第一个循环:排序为真

      在第二个 for 循环中,它基本上检查数组是否已排序。如果它没有排序 -> false 并且循环继续。如果是,则 sorted-> true 并停止执行。

      【讨论】:

        【解决方案4】:

        一般比较如下:

        sorted != sorted
        

        当然,这没有任何意义。但是,您有以下内容:

        sorted = !sorted
        

        通过这样做,您只是否定了排序的条件,这意味着未排序的数组被假定为已排序。然后,如果您遍历整个数组而不进行任何交换,则将赋值的左侧作为条件(在这种情况下为真)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-01-17
          • 2016-08-31
          • 2016-03-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-11
          • 2013-09-04
          相关资源
          最近更新 更多