【HELP】使用c++编写直接插入排序时遇到的问题

问题遇到的现象和发生背景

学习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挪到前面时,上面的情况就会因短路计算而不会发生。