突然发现了两个C++缺陷

WJN92 2019-03-22 05:11:33
	for (DWORD i = 0; i < pTransMesh->dwFaceCount; i++)
{


for (DWORD dwItem = 0; dwItem < 3; dwItem++)
{

if (MinPointCoord.v[dwItem] >= pNoTransMesh->TriangleDivision.vuNumDivisionUnit[dwItem])
goto NextTriangle; //这里使用continue的话不能控制那个循环

}


。。。。。。。。。。


NextTriangle: //这里说我语法错误,郁闷
}

为什么有这样傻的设计呢?
...全文
396 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohuh421 2019-04-02
  • 打赏
  • 举报
回复
多层循环, 用goto, 跟使用标记变量没多在区别. 虽然goto看起来少写了一些if判断, 但稍复杂点的逻辑里面, 一不注意就有各种内存的坑.
sty_app 2019-04-01
  • 打赏
  • 举报
回复
引用 19 楼 worldy 的回复:
for (DWORD i = 0; i < pTransMesh->dwFaceCount; i++)
{


for (DWORD dwItem = 0; dwItem < 3; dwItem++)
{

if (MinPointCoord.v[dwItem] >= pNoTransMesh->TriangleDivision.vuNumDivisionUnit[dwItem])
goto NextTriangle; //

..........................
}


。。。。。。。。。。


NextTriangle: //其后你需要至少一个语句,加个分号做空语句,有何不可?
}

这样的逻辑结构,单使用break或continue都是不行的,需要加入逻辑判断才能使用break或continue,只有使用goto最简洁

争论简不简洁对理解代码毫无益处。goto慎用。一个不小心,也许完全没有按照你的想法在跑。
worldy 2019-03-28
  • 打赏
  • 举报
回复
for (DWORD i = 0; i < pTransMesh->dwFaceCount; i++)
{


for (DWORD dwItem = 0; dwItem < 3; dwItem++)
{

if (MinPointCoord.v[dwItem] >= pNoTransMesh->TriangleDivision.vuNumDivisionUnit[dwItem])
goto NextTriangle; //

..........................
}


。。。。。。。。。。


NextTriangle: //其后你需要至少一个语句,加个分号做空语句,有何不可?
}

这样的逻辑结构,单使用break或continue都是不行的,需要加入逻辑判断才能使用break或continue,只有使用goto最简洁
  • 打赏
  • 举报
回复
continue、break都是针对1层循环的。
可以用throw

try{
for (DWORD i = 0; i < pTransMesh->dwFaceCount; i++)
{


for (DWORD dwItem = 0; dwItem < 3; dwItem++)
{

if (MinPointCoord.v[dwItem] >= pNoTransMesh->TriangleDivision.vuNumDivisionUnit[dwItem])
throw( pTransMesh->dwFaceCount * 3 + dwItem);
}
}
}

catch(int b)
{
cout<< "Break at pTransMesh->dwFaceCount = “<< b/3 <<", dwItem ="<< b%3 << endl;
}


sunriver2000 2019-03-26
  • 打赏
  • 举报
回复
引用 17 楼 丁劲犇 的回复:
continue、break都是针对1层循环的。 可以用throw

try{
    for (DWORD i = 0; i < pTransMesh->dwFaceCount; i++)
    {
 
 
        for (DWORD dwItem = 0; dwItem < 3; dwItem++)
        {
 
            if (MinPointCoord.v[dwItem] >= pNoTransMesh->TriangleDivision.vuNumDivisionUnit[dwItem])
               throw( pTransMesh->dwFaceCount * 3 + dwItem);
        }
   }
}

catch(int b)
{
    cout<< "Break at   pTransMesh->dwFaceCount = “<< b/3 <<", dwItem ="<< b%3 << endl;
}

不错的设计。
天外怪魔 2019-03-25
  • 打赏
  • 举报
回复
引用 15 楼 WJN92 的回复:
[quote=引用 13 楼 bluesen 的回复:] 楼主说没有goto的代码臃肿。 python没有goto有人并没有显示出代码臃肿,不客气地说程序设计方面你尚需入门。goto语句的坏处早在50年前就几乎已经定案,Edsger Wybe Dijkstra在1968年写下了著名的《GOTO陈述有害论》。 建议去搜索一下“意大利面条代码”。
我也迫不得已才使用goto啊,如果continue能控制指定循环的话[/quote] 设置个标记变量, 内层循环设置这个标记,然后break; 外层循环判断这个标记,如果被设置则break; 完全不需要goto语句。 所有用goto语句的行为都是为了表现一下自己够酷,会用goto语句。别去相信为了吸引眼球的网上帖子或者书上的任何关于必须使用goto语句的说法!
WJN92 2019-03-25
  • 打赏
  • 举报
回复
引用 13 楼 bluesen 的回复:
楼主说没有goto的代码臃肿。
python没有goto有人并没有显示出代码臃肿,不客气地说程序设计方面你尚需入门。goto语句的坏处早在50年前就几乎已经定案,Edsger Wybe Dijkstra在1968年写下了著名的《GOTO陈述有害论》。
建议去搜索一下“意大利面条代码”。


我也迫不得已才使用goto啊,如果continue能控制指定循环的话
WJN92 2019-03-25
  • 打赏
  • 举报
回复
引用 12 楼 worldy 的回复:
for (DWORD i = 0; i < pTransMesh->dwFaceCount; i++)
{


for (DWORD dwItem = 0; dwItem < 3; dwItem++)
{

if (MinPointCoord.v[dwItem] >= pNoTransMesh->TriangleDivision.vuNumDivisionUnit[dwItem])
goto NextTriangle; //按照你goto逻辑,你需要的是break而不是continue

}


。。。。。。。。。。


NextTriangle: //其后你需要至少一个语句,加个分号做空语句,有何不可?
}


break也是当前的循环,“NextTriangle:”上面还有很多代码。我是需要进入下一次循环,不再需要执行下面的代码
bluesen 2019-03-24
  • 打赏
  • 举报
回复
楼主说没有goto的代码臃肿。
python没有goto有人并没有显示出代码臃肿,不客气地说程序设计方面你尚需入门。goto语句的坏处早在50年前就几乎已经定案,Edsger Wybe Dijkstra在1968年写下了著名的《GOTO陈述有害论》。
建议去搜索一下“意大利面条代码”。
worldy 2019-03-24
  • 打赏
  • 举报
回复
for (DWORD i = 0; i < pTransMesh->dwFaceCount; i++) { for (DWORD dwItem = 0; dwItem < 3; dwItem++) { if (MinPointCoord.v[dwItem] >= pNoTransMesh->TriangleDivision.vuNumDivisionUnit[dwItem]) goto NextTriangle; //按照你goto逻辑,你需要的是break而不是continue } 。。。。。。。。。。 NextTriangle: //其后你需要至少一个语句,加个分号做空语句,有何不可? }
schlafenhamster 2019-03-23
  • 打赏
  • 举报
回复
因为有时候各种 error 需要 goto 到一个 共同的 错误 处理函数 中去
WJN92 2019-03-22
  • 打赏
  • 举报
回复
引用 7 楼 schlafenhamster 的回复:
goto NextTriangle 改: /////////////////////////////////////// { flag= TRUE;// 加 BOOL flag=FALSE; break; }// 2nd for if (flag) { flag=FALSE; continue;// 1st for } ..............................................
引用 6 楼 marslycan 的回复:
你可以说不爽,但不能随便说是缺陷。
我是不明白为什么有这样的设计
WJN92 2019-03-22
  • 打赏
  • 举报
回复
引用 5 楼 bluesen 的回复:
[quote=引用 4 楼 WJN92 的回复:] [quote=引用 3 楼 bluesen 的回复:] 别抱着goto不放了,你需要的仅仅是一个break;语句
你没有明白我的意思吧,我是要跳到下一次循环,而且break也就是跳出最近一层的循环,像我这种2个嵌套的循环,break一样控制不了最外层的循环[/quote] 加控制变量啊。goto语句很显然是设计不良的体现[/quote] 我不明白为什么要这样做呢?这样做是不是令代码更加臃肿呢?
bluesen 2019-03-22
  • 打赏
  • 举报
回复
别抱着goto不放了,你需要的仅仅是一个break;语句
schlafenhamster 2019-03-22
  • 打赏
  • 举报
回复
没有 ;(空语句) 就不是 一条 语句 !
schlafenhamster 2019-03-22
  • 打赏
  • 举报
回复
goto NextTriangle 改:
///////////////////////////////////////
{
flag= TRUE;// 加 BOOL flag=FALSE;
break;
}// 2nd for
if (flag)
{
flag=FALSE;
continue;// 1st for
}
..............................................
marslycan 2019-03-22
  • 打赏
  • 举报
回复
你可以说不爽,但不能随便说是缺陷。
WJN92 2019-03-22
  • 打赏
  • 举报
回复

for (DWORD i = 0; i < pTransMesh->dwFaceCount; i++)
{


for (DWORD dwItem = 0; dwItem < 3; dwItem++)
{

if (MinPointCoord.v[dwItem] >= pNoTransMesh->TriangleDivision.vuNumDivisionUnit[dwItem])
goto NextTriangle; //这里使用continue的话不能控制那个循环

}


。。。。。。。。。。


NextTriangle:; //我发现了这里要加多一个顿号。无语,否则会编译出错
}
bluesen 2019-03-22
  • 打赏
  • 举报
回复
引用 4 楼 WJN92 的回复:
[quote=引用 3 楼 bluesen 的回复:]
别抱着goto不放了,你需要的仅仅是一个break;语句


你没有明白我的意思吧,我是要跳到下一次循环,而且break也就是跳出最近一层的循环,像我这种2个嵌套的循环,break一样控制不了最外层的循环[/quote]
加控制变量啊。goto语句很显然是设计不良的体现
WJN92 2019-03-22
  • 打赏
  • 举报
回复
引用 3 楼 bluesen 的回复:
别抱着goto不放了,你需要的仅仅是一个break;语句


你没有明白我的意思吧,我是要跳到下一次循环,而且break也就是跳出最近一层的循环,像我这种2个嵌套的循环,break一样控制不了最外层的循环

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧