2014-11-04 54 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