头铁小君使用死循环

头铁小君和小张争论用for(;;)好还是while(true)好。

  小张昨晚敲代码到凌晨两点,早上回来也是精神满满的。哼着小曲路过头铁小君的座位,看到头铁小君桌面写着:

1
2
3
for (;;) {
...
}

  小张看了看说:这不是死循环吗?干嘛用这个呢?看起来也不直观,用while(1)尤其是while(true)更有可读性。我也经常用不会错的,拍了拍头铁小君的肩膀以示肯定。

  一早就被人数落的头铁小君,心有不甘地说:我用for(;;)比你的while(true)快呀。

  小张摸了摸自己的光头,看来是要放大招了。你说的这种情况是旧的非优化编译器时代才是,现代编译器for(;;)while(true)生成的汇编都一样了,它们运行速度都一样。不信你可以写个C代码生成汇编对比下。

  头铁小君不信,立马写了个测试程序

1
2
for (;;);
while(true);

  使用命令gcc -S test.c生成汇编文件test.s

1
2
.L2:
jmp .L2

  看到汇编内容居然一样的,心还是不服。头铁小君也不是浪得虚名的!!!我头铁小君我就是要用for (;;),可是我还要给点理由反驳一下,不然看小张得意洋洋的样子岂不是要飞了。

  思前想后,有了!就用大神Kernighan & Ritchie说的话来反驳

1
2
3
Kernighan & 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(;;)是对的吧。

  小张不屑地说道,你说1I很像,这个我认,但是我还可以用while(true)啊,这个可读性更好。

  头铁小君顿时觉得很有道理,都想伸个大拇指点赞了。可是头铁小君的性格头铁出了名,不会改的。看来是要逼出他大招了。

  小张你看while(1)字符长度为8,while(true)字符长度为11,而for(;;)字符长度为7。单纯用字符长度比较字符短的占用的存储空间少,这间接证明运行速度快。

  小张看到头铁小君这么头铁,连忙说:好吧,你赢了。

  某天小张无意看到头铁小君的死循环写法:

1
2
3
4
5
6
#define Q_FOREVER for(;;)
#define forever Q_FOREVER

forever {
....
}

  摸了摸自己的光头说:哎哟,这个不错。