V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
leisurelylicht
V2EX  ›  编程

今天看书的时候看到这么一句。“多重循环时,尽量不用 break。”不理解啊,请问为什么?

  •  
  •   leisurelylicht · 2015-05-05 17:43:52 +08:00 · 3097 次点击
    这是一个创建于 3493 天前的主题,其中的信息可能已经有所发展或是发生改变。
    5 条回复    2015-05-09 21:53:25 +08:00
    abscon
        1
    abscon  
       2015-05-05 17:59:51 +08:00 via iPhone
    因为这句话本身就有问题。关注点不对。
    leisurelylicht
        2
    leisurelylicht  
    OP
       2015-05-06 09:50:51 +08:00
    @abscon 关注点不对是什么意思?书中的意思应该是在多重循环中不要使用break跳出循环,在书中其它的代码中,跳出循环也多次使用了将for中的判断变量置成一个超范围的值来结束循环。
    abscon
        3
    abscon  
       2015-05-06 11:46:27 +08:00   ❤️ 1
    打个比方,你要学画画,老师会对你说,画画的时候尽量不用紫色,多使用红色吗?用什么颜色显然取决于被画的东西和你要表达的情感。
    再打个比方,你要学中国象棋,老师会对你说,将军的时候尽量用铁门栓,少用马后炮吗?用什么杀招显然取决于棋盘上具体的形势。

    语言提供的这些for啊break啊continue啊if啊else啊goto啊什么的(我假设你学的是类C语言),你可以理解成调色板上不同的颜色。

    你可以想一下,既然书里面表达了自己的偏好(尽量不用break),那么语言的发明者为何不干脆取消掉break呢?既然留着它,说明某些场合下还是可以合理使用break的。那么就应该说清楚:什么时候应该使用break?什么时候不应该使用break,使用和不使用都有何利弊?而不是在写循环之前就确立一个规则:尽量不用break。这本书这么简单粗暴地教你,引起了你的怀疑和不理解,所以在v2ex上发了这个帖子,这是很合理的怀疑。

    而且,对于使用break跳出循环的程序,总可以添加控制变量达到逻辑等价的效果,从而消除break。根据你看到的书里的示范,“尽量不用break”对于你来说其实就是“别用break”。

    我写一个循环之前,自己都不知道要用到些什么关键字。是用while还是for?要不要用break,continue和goto?这些我统统都不知道,没有先验的规则。先想明白你此时此刻代码要做的事情的整个流程,就像下棋一样,以一定的原则(比如清晰/高效)反复调整代码,最后事情就这样成了:)——关注点应该在于某一个具体的循环怎么表达才优美简洁效率高,而不是多使用某某表达方式。

    ------------------------------
    上面说的是这本书在教学方式上的错误。接下来说一下它在内容方面的错误。
    它之所以提倡别用break,是因为它:
    1. 提倡“结构化编程”
    2. 认为使用break(还有return,goto)打破了“结构化编程”的“一进一出”原则

    在这里我不想说1.和2.都是不对的,我只想说:学术上的争论就留给学者去发论文吧。程序员写程序时不要为了学者制订的一个不确定能带来什么收益的规章制度而扭曲自己的思维。 除非该学者告诉你照他说的做可以形式化验证你程序的正确性。
    abscon
        4
    abscon  
       2015-05-06 11:58:36 +08:00   ❤️ 1
    @leisurelylicht 呃,漏看了一个“多重”。补充一下吧。

    如果这书是关于C/C++的,那么这个话题不存在。因为break只能跳出一重循环的,当然要用其他方式跳出“多重”循环,此时不是你“尽量避免使用break”的问题,而是压根用不上。要想自由飞翔得用goto;

    如果这书是关于Java的,break是可以跳出多重循环的。所以这个话题可以存在,只是上贴我说过了,选择这个话题是不恰当的教学方式。
    leisurelylicht
        5
    leisurelylicht  
    OP
       2015-05-09 21:53:25 +08:00
    @abscon 谢谢的你的详细回答。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6017 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 02:10 · PVG 10:10 · LAX 18:10 · JFK 21:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.