C++ 在调试过程中,我的程序跳到最近的while语句而不中断或继续[C+;+;]

C++ 在调试过程中,我的程序跳到最近的while语句而不中断或继续[C+;+;],c++,while-loop,gdb,qt5,program-flow,C++,While Loop,Gdb,Qt5,Program Flow,在gdb下运行我的C++/Qt5程序时,我经历了一种似乎不可能的情况: while(totalAvailable > (sizeof(quint32)+sizeof(quint16))){ if(nullptr!=c){ // POINT-A qDebug()<<rct<<"Courier message with ID "<<octomy_message_type_int<<" was recei

在gdb下运行我的C++/Qt5程序时,我经历了一种似乎不可能的情况:

while(totalAvailable > (sizeof(quint32)+sizeof(quint16))){  
    if(nullptr!=c){
        // POINT-A
        qDebug()<<rct<<"Courier message with ID "<<octomy_message_type_int<<" was received with name "<<c->getName()<<" and "<<bytesAvailable<<" bytes available";
        const quint16 bytesSpent=c->dataReceived(*ds, bytesAvailable);
        const int left=bytesAvailable-bytesSpent;
        totalAvailable-=bytesSpent;
        if(left>=0){
            if(left>0){
                ds->skipRawData(left);
                totalAvailable-=left;
            }
            else{
                // POINT-B
                qDebug()<<rct<<"LOLBOB";
            }
        }
        else{
            qWarning()<<"BAR";
            return;
        }
    }
    else{
        qWarning()<<"FOO";
        return;
    }
}
while(totalAvailable>(sizeof(quint32)+sizeof(quint16)){
if(nullptr!=c){
//A点

qDebug()在点B处,你在一个else中,它在一个if中,它在一个if中。一旦完成了这个else,整个树中就没有什么可做的了

您希望指针跳转到哪里


从技术上讲,它将到达点B后面的两行结束括号,然后到达点B后面的三行结束括号,然后到达点B后面的八行结束括号,最后到达结束括号。所有这些都不做任何操作,因此它们被跳过。

在点B,你在一个else中,它在一个if中,whi中ch在if中。一旦完成了其他操作,整个树中就没有更多的事情要做了

您希望指针跳转到哪里


从技术上讲,它将到达B点后面的两行结束括号,然后到达B点后面的三行结束括号,然后到达B点后面的八行结束括号,最后到达结束括号。所有这些都不做任何操作,因此它们被跳过。

拿一张纸和一支铅笔,画出这一操作的逻辑流程图代码块


您将惊奇地发现,在标记为“点B”的语句之后,唯一可能执行的语句是while循环开头的条件语句,循环体中没有更多要执行的语句,因此在下一次迭代中,执行将返回到
while
条件。

拿一张纸和铅笔,画出这段代码的逻辑流


您将惊奇地发现,在标记为“点B”的语句之后,唯一可能执行的语句是while循环开头的条件语句,在循环体中没有更多的语句可执行,因此在下一次迭代中,执行将返回到
,而
条件。

基本上,循环只是重新迭代。我相信它按预期运行。从A点开始,控制如下所示:

If no.1(点-A)->If no.2->If no.3对应的Else->If no.2的回端->If no.1的回端->while循环的回端

循环结束后,执行将检查循环的条件(如果满足),并重新迭代,最终再次到达A点

while()
{
    if() // If no.1
    {

    // Point-A *****************************

        if() // If no.2
        {
            if() // If no.3
            {
            }
            else()
            {

                // Point-B *****************

            }
        }
        else
        {
        }
    }
    else
    {
    }
}

为了提高调试和可读性,如果是块或循环,请不要继续嵌套-很难跟踪执行情况。

基本上循环只是重新迭代。我相信它是按预期运行的。从A点开始,控制如下所示:

If no.1(点-A)->If no.2->If no.3对应的Else->If no.2的回端->If no.1的回端->while循环的回端

循环结束后,执行将检查循环的条件(如果满足),并重新迭代,最终再次到达A点

while()
{
    if() // If no.1
    {

    // Point-A *****************************

        if() // If no.2
        {
            if() // If no.3
            {
            }
            else()
            {

                // Point-B *****************

            }
        }
        else
        {
        }
    }
    else
    {
    }
}

为了提高调试和可读性,如果是块或循环,请不要继续嵌套,因为很难跟踪执行情况。

请查看是否以相同的方式编写:

while(totalAvailable > (sizeof(quint32)+sizeof(quint16))){  

    if(nullptr==c){
    qWarning()<<"FOO";
        return;
    }

    // POINT-A
    qDebug()<<rct<<"Courier message with ID "<<octomy_message_type_int<<" was received with name "<<c->getName()<<" and "<<bytesAvailable<<" bytes available";
    const quint16 bytesSpent=c->dataReceived(*ds, bytesAvailable);
    const int left=bytesAvailable-bytesSpent;
    totalAvailable-=bytesSpent;
    if(left<0){
        qWarning()<<"BAR";
        return;    
    }

    if(left>0){
        ds->skipRawData(left);
        totalAvailable-=left;
    }
    else{
        // POINT-B
        qDebug()<<rct<<"LOLBOB";
    }    
}
while(totalAvailable>(sizeof(quint32)+sizeof(quint16)){
if(nullptr==c){

qWarning()如果您以相同的方式编写,请查看:

while(totalAvailable > (sizeof(quint32)+sizeof(quint16))){  

    if(nullptr==c){
    qWarning()<<"FOO";
        return;
    }

    // POINT-A
    qDebug()<<rct<<"Courier message with ID "<<octomy_message_type_int<<" was received with name "<<c->getName()<<" and "<<bytesAvailable<<" bytes available";
    const quint16 bytesSpent=c->dataReceived(*ds, bytesAvailable);
    const int left=bytesAvailable-bytesSpent;
    totalAvailable-=bytesSpent;
    if(left<0){
        qWarning()<<"BAR";
        return;    
    }

    if(left>0){
        ds->skipRawData(left);
        totalAvailable-=left;
    }
    else{
        // POINT-B
        qDebug()<<rct<<"LOLBOB";
    }    
}
while(totalAvailable>(sizeof(quint32)+sizeof(quint16)){
if(nullptr==c){

qWarning()当然,它将返回到
while
//POINT-B
之后的代码都无法从
//POINT-B
访问。所有剩余的代码都位于已被拒绝的else块中。它还应该返回到哪里?当然,它将返回到
while
之后的代码。
//POINT B
可以从
//POINT-B
访问。所有其余的代码都在已被拒绝的else块中。它应该去哪里?当然你是对的!我只是习惯于用括号跳转的可视化调试器,而这个不习惯!当然你是对的!我只是习惯于用括号跳转的可视化调试器,而且这个不行!