学习c++做一个小项目的过程中,其中的一个排序模块遭遇了程序崩溃的问题,经过排查解决了问题,但是其中原因我无法找到。
worker *tmp=NULL;
int j,i;
for( i=1;i<this->workernum;i++){
if(this->workerarray[i]->num<this->workerarray[i-1]->num){
tmp=this->workerarray[i];
cout<<this->workerarray[i]->num<<endl;
for( j=i-1;this->workerarray[j]->num>tmp->num &&j>=0 ;j--){
this->workerarray[j+1]=this->workerarray[j];
}
this->workerarray[j+1]=tmp;
}
}
}
可见,只是一个直接插入排序。其中workerarray为类中指针数组,num为类中变量,个人认为关系不大。
我所发现的错误代码在
for( j=i-1;this->workerarray[j]->num>tmp->num &&j>=0 ;j--)
将其中条件j>=0与this->workerarray[j]->num>tmp->num交换后程序正确
如
for( j=i-1;j>=0&& this->workerarray[j]->num>tmp->num ;j--)
所以,为什么会发生这样的问题,原因是什么,希望大家可以帮助我。
这是一个C++的基础知识啊,&&的短路效应,&&运算符会先计算第一个表达式,如果不成立,不会再计算第二个表达式。具体到你的程序中,如果j>=0放在前面,这样如果j<0,就不会判断this->workerarray[j]->num>tmp->num,而如果j>=0放在后面,当j<0时,会先计算this->workerarray[j]->num>tmp->num,j是负数,所以就异常了。
别忘了采纳一下,谢谢
运算符优先级。它这个运算是有顺序的。
当j<0时,计算表达式this->workerarray[j]->num>tmp->num &&j>=0
中&&
之前的操作数就会workerarray
数组访问越界,在用其指针访问num就会出错,因为越界访问获得的指针是无效指针
当你把j>=0
挪到前面时,上面的情况就会因短路计算而不会发生。