在此代碼中使用a--
和b++
顯示分段錯誤,但是如果我正在給--a
和++b
其工作,爲什麼?爲什麼我在下面的代碼中出現分段錯誤(核心轉儲)?
add(a,b)
{
if (a==0)
return b;
else
return add(a--,b++); //why this line didn't work??!
}
在此代碼中使用a--
和b++
顯示分段錯誤,但是如果我正在給--a
和++b
其工作,爲什麼?爲什麼我在下面的代碼中出現分段錯誤(核心轉儲)?
add(a,b)
{
if (a==0)
return b;
else
return add(a--,b++); //why this line didn't work??!
}
的後增量和減量運算符實際上遞增或遞減的值的表達式求值之後,意味着它們已被傳遞給函數後它會改變的a
和b
的值。
這種方式,你會最終傳遞的a
和b
不變值add()
功能所有的時間,這將導致堆棧溢出(導致分段錯誤),因爲這基本上是一個遞歸函數永不滿足的條件返回。
OTOH,如果你使用預遞增或遞減運算的a
和b
值將得到降低它們傳遞之前遞歸調用add()
,從而滿足了return
條件,因此你的程序按預期運行。
也就是說,你應該指定一個函數的返回類型,例如,在這種情況下,int
。
感謝您的重播。 – manuel314ad
@SouravGhosh誰知道,也許如果你多讀一次評論/回答可能會被稱爲重播:)) – Michi
是的問題是因爲你做了一個後增加/減少,加入或減去後進入功能。你實際上進入了一個無限循環,可能會給你一個分段錯誤。
另外,你的函數定義是錯誤的。
這應該是你的代碼:
int add(int a,int b)
{
if (a==0)
return b;
else
return add(--a,++b);
//or
//return add(a-1,b+1);
}
分段故障涉及到分配的邊界外的內存訪問。目前,你的函數會導致一個StackOverflow,因爲add函數被無休止地調用,直到堆棧指針不能再被繼續推送。
在導致SegmentationFault的代碼中,很可能還有其他東西,您沒有在此處公開。
代碼無效C++。 – juanchopanza
你能告訴我們你在編程什麼語言,並且也粘貼錯誤信息 –
這是因爲操作符被應用爲postincrement而不是preincrement ..當變量在堆棧上傳遞給遞歸調用時,它必須先遞增(不是之後)循環結束 – amdixon