c – 是“for(;;)”无限循环的成语正确归因于PDP-11 C编译器?

最近我发现 this article声称,为了(1)无限循环,偏好(;;)的想法是因为最初在PDP-11上可用的C编译器为(1)生成一个额外的机器指令.

Btw现在甚至Visual C警告tend to favor the former.

这种归因于(;;)成语的现实意义如何?

解决方法

这是V7 Unix编译器cc生成的(使用 SIMHTUHS的映像):
$cat>a.c
main(){
 while(1);
}
$cat>b.c
main(){
 for(;;);
}
$cc -S a.c
$cc -S b.c

a.c(while)编译为:

.globl  _main
.text
_main:
~~main:
jsr     r5,csv
jbr     L1
L2:L4:tst       $1
jeq     L5
jbr     L4
L5:L3:jmp       cret
L1:jbr  L2
.globl
.data

而b.c(for)变为:

.globl  _main
.text
_main:
~~main:
jsr     r5,csv
jbr     L1
L2:L4:jbr       L4
L5:L3:jmp       cret
L1:jbr  L2
.globl
.data

所以至少在(但是,当使用-O编译时,两个程序都会产生完全相同的程序集:

.globl  _main
.text
_main:
~~main:
jsr     r5,csv
L4:jbr  L4
.globl
.data

当我添加一个循环体的printf(“Hello”);程序仍然是一样的.

所以,这个成语可能源于PDP-11机器语言,但到了1979年,这个差异已经在很大程度上是无关紧要的.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...