为啥C++等高级语言不设计得和Shell脚本语言一样,让break与continue带有一个参数

1. 这个和面向对象倒没什么关系。2. 最多和结构化编程的取舍能扯上关系。结构化就比较讲究一层层进,一层层出。c++加了异常处理后,有人的反对,罗列的罪状就包括这一条:某处抛异常,程序看起来直接跑到很外面的某层才接住,甚至没处接就程序退出,不像C的错误返回机制一层层退出直观云云……3. 最真实情况是,其实这就是C没这么做,很多语言也就随了它。没看switch下的case都是默认不会break而要往下进入下一个case这样更不合理的大坑设计,不也C++,java,C#等语言一路随了下来?C++直到今天才加了点补丁来补救,但子没多少人在乎了,当然,对新人还是有帮助的。是好事。4. C# 这样讲究语言美好和处女座,我记得是一开始就支持加上label直接跳到指定的外层位置。这个方案我觉得也比break n 好点。
■网友
如果你break n,n是变量呢?或者break的层数比当前循环嵌套层数高呢?
C++是静态编译语言,所有代码的语义必须在编译时确定。如果这个break n语义不确定,编译器翻译成汇编的jump时就没法放置跳转标签。
这段语法带来的编译器复杂性远比这个语法带来的好处高。
另外,之所以C++会有goto是对C的前向兼容导致的。C作为汇编的高级语言,设计的时候goto就对应了汇编的jump,但后来发现goto语法太过灵活,弊大于利,在主流实践中是被deprecated的,之所以保留是由于C语言早期的legacy code们。
后来的高级语言基本都弃用了goto,像Java就仅仅保留了goto关键字但是没有提供goto语法功能,而Python根本就没有goto语法。

■网友
loop@ for(i in 1..100){ for(j in 1..100){ if(...) break@loop }}Kotlin 等一些现代化语言是支持这种方式的,和 break 直接加某种变量不同,使用指定好的循环名称就可以了。

■网友
我觉得是因为C提供了goto,所以也没有这类break , continue 的syntax sugar,然后各类C系的语言也就继承了此特点。我乱说的(逃
■网友
其实我到是觉得,因为 C++ 等语言牵扯到很多层面的收尾工作,如果对循环等等结构体的控制太过于灵活,可能会导致内存的使用和管理上存在问题。导致内存泄漏、溢出或者闲置而导致程序 bug 太多。
【为啥C++等高级语言不设计得和Shell脚本语言一样,让break与continue带有一个参数】 所以如果不提供某些功能,你就要考虑各种层级之间的实现,也顺便强制你去解决错误带来的后果。

■网友
emmmm..其实当break 或 continue 都需要指定层数跳出时,你是时候要考虑程序设计是否有问题了。代码应该尽量避免多重的嵌套而不是用语法上的优势去偷懒。虽然我也觉得shell这样更方便。但在有了设计模式之后,这种语法特点并不能成为什么优势,C++没必要模仿。
■网友
Shell这些根本就不是面向对象语言,自然无从谈面向对象,所以这种方式是可以的。而c++这些是面向对象语言,自然是面向对象的,所以这种写法就直接破坏了面向对象,当然咯,goto这些是为了在特殊情况下使用的,正常使用情况下不会破坏面向对象。


    推荐阅读