在酷壳看到一个编程题目——请把从1到1000的数打印出来,不能使用任何的循环语句或条件判断语句,更不能写1000个printf和cout,用C/C++语言。
最容易想到的是用递归,文中给出了一个例子:
该程序的本意是在n==1000时,n/(1000-n)的分母为0,使程序崩溃,从而结束递归。
不过用gcc编译执行时,并没有出现崩溃,而是一直输出。
只有将分母为0的除式赋值给一个变量时,程序才会崩溃,更改如下:
还有一个用宏实现的方法,不得不感叹宏的强大:
最后与一个很BT的:
这也是一个递归,利用main函数作为递归函数,
当j<1000时,j/1000为0,因为j是int型,所以执行:
(main+(exit-main)*0)(j+1);
也就是
main(j+1);
当j=1000时,j/1000为1,执行:
(main+(exit-main)*1)(1000+1);
main和exit都是函数名,即函数在内存中的地址,是可以做加减运算的,所以这时执行:
exit(1000+1);
程序退出,结束递归。
为什么j的初始值为1呢?
因为带参数的main函数的原型是:
main(int argc, char **agrv);
这里省略了第二个参数,j就是argc,程序执行是不带参数,j就是1。
所以,该程序要想真正执行,是不能带参数的。
受益匪浅!!!