更新
该程序是Pi - Unleashed一书中Pi的数字的插口算法的故意混淆实现,我们可以在该书的第 37 页找到原始版本,如下所示:
a[52514],b,c=52514,d,e,f=1e4,g,h;main(){for(;b=c-=14;h=printf("%04d", e+d/ f))for(e=d%=f;g=--b*2;d/=g)d=d b+f (h?a[b]:f/5),a[b]=d % - G;}
论文Unbounded Spigot Algorithms for the Digits of Pi在解释算法方面做得很好。基本上它是这个扩展的一个实现:

原来的
除了让代码无法理解和给人们留下深刻印象之外,它被设计成这种方式的原因让我无法理解,但我们可以分解正在发生的事情,首先在这里:
long a[35014],b,c=35014,d,e,f=1e4,g,h;
变量是静态的,因为它们是全局的,因此所有未显式初始化的变量都将初始化为0
. 接下来我们有一个外部for 循环:
for(;(b=c-=14); h=printf("%04ld",e+d/f)
^ ^ ^
1 2 3
- 是一个空初始化,它也是一个空语句。
- 减去并将值重新分配
14
给,并将相同的值分配给。该循环将执行时间,因为是 2501,并且在第th 次迭代中,结果将因此为false,并且循环将停止。c
c
b
2500
35014/14
2501
0
h
正在分配其结果printf
是打印的字符数。打印出来的是格式说明符中的结果,并且总是e+d/f
至少有 4 位数字和零填充。04
现在我们有一个内部for 循环:
for(e=d%=f;(g=--b*2);d/=g)
^ ^ ^
1 2 3
- 初始化
e
和。d
_d modulus f
- 由于运算符的优先级,预先递减
b
和倍增,并将2
结果分配给g
d
正在被除以g
并分配结果。
最后是内部 for 循环的主体:
d=d*b+f*(h?a[b]:f/5), a[b]=d%--g;
^ ^
1 2
使用条件运算符in1
和逗号运算符in 2
。所以我们至少可以把它分成:
d = d*b+f*(h?a[b]:f/5) ; // (1)
a[b] = d%--g; // (2)
(1)
可以进一步细分为:
long tmp = h ? a[b] : f/5 ; // conditional operator
d = (d * b) + f * tmp;
条件运算符仅在第一次迭代期间很重要,因为它h
被初始化为0
但以后永远不会再次出现,因为它总是在外部for 循环0
中分配一个非零值,所以除了第一次之外将被分配。h
a[b]
(2)
将再次由于优先级预先递减g
,然后计算d
模数并将其分配给a[b]
.