如何在c编程中不使用循环,递归或goto语句打印1到100?

时间:2016-07-08 08:47:39

标签: c algorithm

我从互联网上找到了这个解决方案。

#include <stdio.h>
#include <stdlib.h>
int n = 0;
void first() {
    void* x;
    printf("%d\n", ++n);
    if (n >= 100) {
        exit(0);
    }   
    *((char**) (&x + 4)) -= 5;
}
int main() {
    first();
    return 1;
}

有人可以解释一下*((char**) (&x + 4)) -= 5;行的含义吗?

1 个答案:

答案 0 :(得分:4)

这项运动毫无意义。话虽如此,它似乎是你的&#34; hack&#34;试图模拟setjmp/longjmp的行为,它存储/恢复执行环境的状态,例如程序计数器。

// Silly code to solve artificial problems. Don't write programs like this.
#include <stdio.h>
#include <setjmp.h>

void silly_print (int max)
{
  jmp_buf jb;
  int n = setjmp(jb);
  printf("%d\n", ++n);
  if(n < max)
  {
    longjmp(jb, n);
  }
}

int main() 
{
  silly_print(100);
}

注意: setjmp/longjmp被认为是危险的,因为它们可能会导致各种意外的副作用。它们也被认为是不好的做法,因为它们可用于意大利面条编程,如上面的代码所述