今天练了手冒泡排序,初始程序代码如下(伪随机):
#include <iostream> using namespace std; int main() { int a[100]; for (int i=0;i<100;i++){ a[i]=rand()%900+100; } a[0]=0; //自主设定数组最前面的值,测试break效果 a[1]=1; a[2]=2; int temp=0; //冒泡排序中暂存需要交换的值 int count=0; //记录到break为止最外层for循环进行的次数 bool change=false; //设定参数判定终止for循环的条件 for(int j=99;j>0;j--) { for(int k=0;k<=j-1;k++) { if(a[k]>a[k+1]) { temp = a[k]; a[k] = a[k+1]; a[k+1] = temp; change=true; } } count=100-j; if (change==false) break; else change = false; } for(int i=0;i<100;i++) { cout<<a[i]<<" "; } cout<<endl; cout<<"排序在第"<<count<<"遍冒泡结束后终止"<<endl; system("PAUSE"); return 0; }
但是程序运行结果中,总是显示“排序在第99遍冒泡结束后终止”,即最外层for循环全部运行了一遍,break没有起到效果……
找了半天没看出哪里有错误,后知后觉,是if判定中的连等号写成了等号……应为如下:
if (change==false) break; else
想必是从前学VB的习惯吧。那里边判定就是等号,所以怎么看也看不出来
就目前所知,连等“==”一般用于判定/比较两边的值,等号“=”则一般在赋值过程中使用
这种不属于编译错误,很难查错,一般需要逐行分析各变量的值才能发觉(尤其是存在上述知识错觉的情况下)
**谨记养成良好语法记忆与习惯的重要性**