头铁小君和小张争论用
for(;;)
好还是while(true)
好。
小张昨晚敲代码到凌晨两点,早上回来也是精神满满的。哼着小曲路过头铁小君的座位,看到头铁小君桌面写着:1
2
3for (;;) {
...
}
小张看了看说:这不是死循环吗?干嘛用这个呢?看起来也不直观,用while(1)
尤其是while(true)
更有可读性。我也经常用不会错的,拍了拍头铁小君的肩膀以示肯定。
一早就被人数落的头铁小君,心有不甘地说:我用for(;;)
比你的while(true)
快呀。
小张摸了摸自己的光头,看来是要放大招了。你说的这种情况是旧的非优化编译器时代才是,现代编译器for(;;)
和while(true)
生成的汇编都一样了,它们运行速度都一样。不信你可以写个C代码生成汇编对比下。
头铁小君不信,立马写了个测试程序:1
2for (;;);
while(true);
使用命令gcc -S test.c
生成汇编文件test.s
1
2.L2:
jmp .L2
看到汇编内容居然一样的,心还是不服。头铁小君也不是浪得虚名的!!!我头铁小君我就是要用for (;;)
,可是我还要给点理由反驳一下,不然看小张得意洋洋的样子岂不是要飞了。
思前想后,有了!就用大神Kernighan & Ritchie说的话来反驳1
2
3Kernighan & Ritchie long ago recommended for (;;) , which has the additional benefit
of insuring against the visually-confusing defect of a while (l); referencing a variable ‘l’.
Kernighan & Ritchie很久以前就推荐使用for(;;),它有一个额外的好处,可以防止1与字母I的视觉混乱缺陷。
头铁小君在某些印刷体或字体库中阿拉伯数字1与字母I很像,小张你看我用for(;;)
是对的吧。
小张不屑地说道,你说1和I很像,这个我认,但是我还可以用while(true)
啊,这个可读性更好。
头铁小君顿时觉得很有道理,都想伸个大拇指点赞了。可是头铁小君的性格头铁出了名,不会改的。看来是要逼出他大招了。
小张你看while(1)
字符长度为8,while(true)
字符长度为11,而for(;;)
字符长度为7。单纯用字符长度比较字符短的占用的存储空间少,这间接证明运行速度快。
小张看到头铁小君这么头铁,连忙说:好吧,你赢了。
某天小张无意看到头铁小君的死循环写法:1
2
3
4
5
6
forever {
....
}
摸了摸自己的光头说:哎哟,这个不错。