这是一个基本的C程序,它不使用循环或条件来打印数字。我想知道它是如何做的,以及"退出"和"主要"。 main
是否用于递归?
#include <stdio.h>
#include <stdlib.h>
void main(int j) {
printf("%d\n", j);
(&main + (&exit - &main)*(j/1000))(j+1);
}
答案 0 :(得分:5)
假设j为500.那么(&exit - &main)
某事(无关紧要)且(j/1000)
为0,所以(&main + (&exit - &main)*(j/1000))(j+1)
实际上是{{ 1}}。相反,如果j为1000,则main(501)
为1,这意味着(j/1000)
与(&main + (&exit - &main)*(j/1000))
相同(也就是说,(&main + (&exit - &main))
),因此它调用{ {1}}而不是。
答案 1 :(得分:4)
我建议它应该如下工作:
j < 1000
时,请使用参数&main + (&exit - &main)*(j/1000)
调用j+1
。自j/1000 == 0
起,它就会调用main(j+1)
。j = 1000
时,自j/1000 == 1
起,它会调用&main + (&exit - &main) * 1
== exit
。但是,这个微小的C程序存在很多错误。例如,void main(int)
不是标准main
签名。
答案 2 :(得分:3)
这个实际上编译为没有任何条件的程序集:
#include <stdio.h>
#include <stdlib.h>
void main(int j) {
printf("%d\n", j);
(&main + (&exit - &main)*(j/1000))(j+1);
}
尝试:添加&#39;&amp;&#39;所以它会考虑地址,从而规避指针错误。
上述版本采用标准C,因为它不依赖于函数指针的算术运算:
#include <stdio.h>
#include <stdlib.h>
void f(int j)
{
static void (*const ft[2])(int) = { f, exit };
printf("%d\n", j);
ft[j/1000](j + 1);
}
int main(int argc, char *argv[])
{
f(1);
}
答案 3 :(得分:3)
考虑你的陈述:
(&main + (&exit - &main)*(j/1000))(j+1);
if j < 1000, then
(&exit - &main)*(j/1000) == 0 (integers division)
// So we are calling main(j+1)
else if j == 1000
(&exit - &main)*(j/1000) == &exit - &main
// So we are calling (&main + &exit - &main)(j+1), which is calling exit(j+1)
所以你的程序递归调用main()直到j == 1000,此时它调用exit
这个程序在编程/最佳实践等方面是错误的......你应该忘掉它。