循环语句警告的冒泡排序算法
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
通过这样做,您只是否定了排序的条件,这意味着未排序的数组被假定为已排序。然后,如果您遍历整个数组而不进行任何交换,则将赋值的左侧作为条件(在这种情况下为真)。
【讨论】:
以上是关于循环语句警告的冒泡排序算法的主要内容,如果未能解决你的问题,请参考以下文章