C++ 在调试过程中,我的程序跳到最近的while语句而不中断或继续[C+;+;]
在gdb下运行我的C++/Qt5程序时,我经历了一种似乎不可能的情况: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
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块中。它应该去哪里?当然你是对的!我只是习惯于用括号跳转的可视化调试器,而这个不习惯!当然你是对的!我只是习惯于用括号跳转的可视化调试器,而且这个不行!