2015-08-30 28 views
-5

在此代碼中使用a--b++顯示分段錯誤,但是如果我正在給--a++b其工作,爲什麼?爲什麼我在下面的代碼中出現分段錯誤(核心轉儲)?

add(a,b) 
{ 
    if (a==0) 
     return b; 
    else 
     return add(a--,b++); //why this line didn't work??! 
} 
+7

代碼無效C++。 – juanchopanza

+0

你能告訴我們你在編程什麼語言,並且也粘貼錯誤信息 –

+6

這是因爲操作符被應用爲postincrement而不是preincrement ..當變量在堆棧上傳遞給遞歸調用時,它必須先遞增(不是之後)循環結束 – amdixon

回答

5

的後增量和減量運算符實際上遞增或遞減的值的表達式求值之後,意味着它們已被傳遞給函數後它會改變的ab的值。

這種方式,你會最終傳遞的ab不變值add()功能所有的時間,這將導致堆棧溢出(導致分段錯誤),因爲這基本上是一個遞歸函數永不滿足的條件返回。

OTOH,如果你使用預遞增或遞減運算的ab值將得到降低它們傳遞之前遞歸調用add(),從而滿足了return條件,因此你的程序按預期運行。

也就是說,你應該指定一個函數的返回類型,例如,在這種情況下,int

+0

感謝您的重播。 – manuel314ad

+0

@SouravGhosh誰知道,也許如果你多讀一次評論/回答可能會被稱爲重播:)) – Michi

2

是的問題是因爲你做了一個後增加/減少,加入或減去後進入功能。你實際上進入了一個無限循環,可能會給你一個分段錯誤。

另外,你的函數定義是錯誤的。

這應該是你的代碼:

int add(int a,int b) 
{ 
    if (a==0) 
     return b; 
    else 
     return add(--a,++b); 
     //or 
     //return add(a-1,b+1);  
} 
1

分段故障涉及到分配的邊界外的內存訪問。目前,你的函數會導致一個StackOverflow,因爲add函數被無休止地調用,直到堆棧指針不能再被繼續推送。

在導致SegmentationFault的代碼中,很可能還有其他東西,您沒有在此處公開。

相關問題