循环语句警告的冒泡排序算法

Posted

技术标签:

【中文标题】循环语句警告的冒泡排序算法【英文标题】: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% 洁净。在我处理的代码中,条件内的赋值非常常见。 【参考方案1】:

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

sorted = !sorted

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

(sorted = !sorted) == true

使警告静音。

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

第一个循环:排序为真

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

【讨论】:

【参考方案4】:

一般比较如下:

sorted != sorted

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

sorted = !sorted

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

【讨论】:

以上是关于循环语句警告的冒泡排序算法的主要内容,如果未能解决你的问题,请参考以下文章

Python版冒泡排序算法

Python版冒泡排序算法

算法排序冒泡排序

算法排序之冒泡排序

GO-冒泡排序算法

经典算法学习——非循环双向链表实现冒泡排序(不带头结点)