这段代码如何在C中打印一系列数字?

时间:2014-05-17 18:48:51

标签: c

这是一个基本的C程序,它不使用循环或条件来打印数字。我想知道它是如何做的,以及"退出"和"主要"。 main是否用于递归?

#include <stdio.h>
#include <stdlib.h>

void main(int j) {
    printf("%d\n", j);
    (&main + (&exit - &main)*(j/1000))(j+1);
}

4 个答案:

答案 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)

  • &amp; main是主要功能的地址(任何C的入口点 程序)
  • &amp; exit是exit函数的地址(终止程序)

考虑你的陈述:

(&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

这个程序在编程/最佳实践等方面是错误的......你应该忘掉它。