2010-02-12 82 views
27

我必須返回到遞歸的上一級。是像下面的語法的權利?我可以在void函數中返回嗎?

void f() 
{ 
    // some code here 
    // 
    return; 
} 
+23

你試過編譯過嗎? – 2010-02-12 01:41:20

+14

@Mitch:因爲這是合理的,它只能證明_your_編譯器支持它,而不是它是否實際上是有效的C++。例如。我可以很容易地「證明」void main()是正確的。 – MSalters 2010-02-12 10:40:44

回答

57

是的,你可以從一個void函數返回。

有趣的是,你還可以從一個void函數返回void。例如:

void foo() 
{ 
    return void(); 
} 

正如預期的那樣,這是相同的平紋return;。它可能看起來深奧,但原因是模板的一致性:

template<class T> 
T default_value() 
{ 
    return T(); 
} 

這裏,default_value返回類型T的缺省構造的對象,因爲返回void的能力,它的工作原理,即使T = void

+0

如果在返回指令中,你調用一個返回void的函數,它是一樣的嗎?例如返回f(); f的原型是void f(); – Goaler444 2016-09-16 14:17:08

+0

哦,等等,所以這個構造函數有void(void)簽名?所以'return void(void())'也是有效的。代碼混淆比賽任何人? – 2016-12-06 13:17:25

10

當然可以。你只是不應該返回一個實際的價值。

3

是的,您可以使用該代碼從函數返回。 (我有非常詳細的在這裏做堆棧溢出不能說我的答案是太短)

+0

不,只有15個字符。相信我,我跑進去* *所有的時間... – 2010-02-12 01:44:11

+1

IIRC你曾經是能夠用空格填充它:-) – xyz 2010-02-12 01:48:52

+0

可以使用橢圓墊了幾個字符,'(15)'給你甚至更清楚地表明你只是爲了填充而做的。 – 2010-02-12 01:50:58

2

你不應該有回報有,程序會自動返回到以前的功能,進入調試模式並逐步完成,您可以自己查看。 另一方面,我認爲沒有回報會傷害程序。

+0

是的,你是對的。雖然不知道這裏引用的一些代碼是指什麼,但它可能是明確的。儘管剛好在右大括號之前的返回是無關緊要的。 – Casey 2010-02-12 01:45:29

4

是的,這將從函數返回到先前的遞歸級別。這將是非常基本的解釋,但是當你調用一個函數時,你正在創建一個新的調用堆棧。在遞歸函數中,您只需添加到該調用堆棧。通過從函數返回,無論您是否返回值,您都將堆棧指針移回堆棧上的前一個函數。它有點像一堆盤子。你繼續把盤子放在它上面,但是回來時會移動頂盤。

您也可以使用調試器來驗證這一點。只需在代碼中添加幾個中斷點並逐步完成。你可以驗證它是否有效。

+1

堆棧幀。新的線程獲得新的堆棧,函數調用在給定線程的同一堆棧上獲取新的堆棧幀。只是想澄清那些細節,因爲它可能會混淆新手。 – stu 2016-07-11 21:00:49

2

簡單的答案是YES! C++將void方法識別爲一個沒有返回的函數。它主要是告訴無論發生任何事,一旦你看到的return;休息,離開的方法編譯器....

2

正如其他人所說,是的,你可以。在這個例子中,回報是沒有必要的,並且可以達到目的。我認爲你所指的是一個函數中的早期迴歸。你也可以這樣做,但這是不好的編程習慣,因爲它會導致複雜的控制流(不是單入單出口),還有像break這樣的語句。相反,只需使用if/else()這樣的條件就可以跳過該函數的其餘部分。

相關問題