2014-11-04 28 views
10

我看到一个c + +编程上下文的问题,我检查一个解决方案,我的一个朋友给我这个代码其作品完美,但我不明白它的逻辑,以及它是如何作品。我问他这件事,但他也不知道该程序是如何工作的,我认为他也从某个地方采取了这个解决方案。任何人都可以解释这背后的逻辑我的意思是在行 (&main +(&exit - &main)*(j/1000))(j+1);打印1到1000与出使用循环

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

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

在此先感谢

+2

不能在C++中递归调用'main'。 – BLUEPIXY 2014-11-04 09:32:22

+1

感谢您的快速回放。我尝试在C++中,但它不会工作,但在其作品完美。但我不知道它是如何工作。我的意思是它的逻辑 – 2014-11-04 09:34:02

+7

这是一个标准的'主'签名? – axiom 2014-11-04 09:40:04

回答

28

其工作原理如下:

执行的intj/1000,这将返回0总是同时j1000小。 使指针操作如下:

&main + 0 = &main, for j < 1000. 

然后调用通过传递作为参数j+1指针指向操作所得到的函数。 虽然j小于1000,但它会以比前一步更多的参数1递归地调用main。

j值达到1000,则整数除法j/1000等于1,并且指针操作导致执行以下操作:

&main + &exit - &main = &exit. 

它然后调用exit函数,该函数结束程序的执行。

+0

感谢您的重播 – 2014-11-04 09:37:48

+0

退出功能是否必须明确写入?或者它可以从主要推论? – 2014-11-04 09:37:49

+2

退出函数来自stdlib.h中定义的C std库。 – LoPiTaL 2014-11-04 09:39:01

4

我去与已给出的解释,但它会更容易理解,如果下面写:

void main(int j) { 
    if(j == 1001) 
     return; 
    else 
    { 
     printf("%d\n", j); 
     main(j+1); 
    } 
} 

上面的代码不会与已编写的代码。

+1

实际上这比上面更简单,但是逻辑不同 – 2014-11-04 10:52:01

+0

虽然这个想法是相同的。你所拥有的那个刚刚被混淆了,这是执行递归的规范方法: - 虽然你通常不会使用'main'来做它,因为它在技术上不是一个有效的'main'签名iirc – Baldrickk 2014-11-04 10:56:59

+1

真的这是更多简单的方法而不是上面的方法。感谢您的重播 – 2014-11-04 11:36:32