如何在不使用循环,递归或goto语句的情况下打印一系列数值?

zul*_*shi 0 c algorithm pointers

我从互联网上找到了这个解决方案,但我无法理解.

#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;
}
Run Code Online (Sandbox Code Playgroud)

本声明的目的和机制是*((char**) (&x + 4)) -= 5;什么?

还有其他方法不那么复杂吗?

Sam*_*man 9

"诀窍"在于

*((char**) (&x + 4)) -= 5;
Run Code Online (Sandbox Code Playgroud)

x会将内存更改为超出存储位置的4个字节,并将其减少5.

假设这段代码适合你,它正在改变函数的返回地址,大概是这样的,而不是返回到行的main

return 1
Run Code Online (Sandbox Code Playgroud)

它改为返回到该行

first();
Run Code Online (Sandbox Code Playgroud)

也就是说,它依赖于处理器的知识,堆栈帧布局和编译器的输出来合成类似于goto语句的东西.

所以,重写

*((char**) (&x + 4)) -= 5;
Run Code Online (Sandbox Code Playgroud)

在英语中,它看起来像"改变我回归的地方,早先是一个声明." 这是一个噱头,而不是你将来可以依赖的东西.

  • @Olaf关于"我应该做那样的事情","未定义的行为",是故事的结尾.然而,在理解计算机如何工作方面,我们可以说更多 (5认同)
  • @bluejack:技术上简单的垃圾.对于仍然试图理解茶叶的人来说,显然不能经常警告这些东西. (2认同)