4

do…while比while好在那里?为什么要专门设计个do…while?

 2 years ago
source link: https://www.zhihu.com/question/26910078/answer/2199713855
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

do…while比while好在那里?为什么要专门设计个do…while?

写foreach,for,while写惯了,突然想写个do…while,觉得不好用~~
48
39,263
登录后你可以
不限量看优质回答私信答主深度交流精彩内容一键收藏
CrackingOysters,源于编程珠玑,也是公众号

没有好处(或者一丁点好处可以忽略不计)。

这不是我说的,是Python之父Guido van Rossum说的。


我从来不写do while。

以前是因为觉得do while别扭。直到我读到了Python PEP (Python Enhancement Proposal),才明白了其中的缘由。

Python里面根本没有do while (Rust里面也没有)。而且Python之父还特别把别人要添加的请求给拒掉了,理由是,

  • do while 没有让语言更容易的使用,有它只是让某些人少打一些字。其他维护这些代码的人还要思考这是什么意思。
  • 任何do while的形式都可以被如下结构替换掉,并且没有什么形式的do while比得过如下结构,
while True:
    <set up code>
    if <condition> not met:
       break
    <loop body>

PIP节选如下,

出处:https://www.python.org/dev/peps/pep-0315/


我开了篇文章,记录我觉得那些有趣有用的PEP,比如本回答说的这一点

CrackingOysters:不要用do while,无事读读PEP

继续浏览内容
发现更大的世界
Chrome
IT为主,兴趣广泛,爱好强答

一开始应该只是为了那种“先做循环体再判断是否退出”的需求产生的,这种需求其实还是有一些的,例如:从一个文件read所有数据到内存,每次read并不一定能读到所有数据:

Buffer buf;
do {
    buf.extend(file.read());
} while (!file.eof());

简单起见这里用了伪码,实际应该会多一些细节,不过大致意思就是这样,并不是C独有,所有语言都可能碰到这个情况

不过后来do while在C中被用在了另外的一个地方:

#define F(x) do {...} while (0)

至于这里为啥一定用do while(0),而不是其他方式,可以看下相关的资料

继续浏览内容
发现更大的世界
Chrome
知乎十年新知答主

所有的循环都能翻译成 for。而且也基本不影响使用跟阅读。

比如这是while:

for (;condition;) { }
while (condition) { }

可以看到 while 跟 for 的语法糖没啥区别。

而do while循环翻译成for之后的形态是不优雅的。本身也足够特别,值得单独设计一个。

for (bool b=true;b ; b=condition) { }

do{ } while (condition);

do while 最初存在的意义就是 while 所使用的 condition 必须在循环体内求值一次,所以无法在循环体之前判断 condition 的值。

后来被玩出了黑科技,也就是 do { } while(0) ,这个黑科技要求后边必须使用一个分号才合法,因此被广泛用于宏定义来表示代码段。

继续浏览内容
发现更大的世界
Chrome

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK