Perchè se scrivi così:
codice:
void scrivi(int n)
{
if (n==0) return;
scrivi(n--);<-----errore,crash
for (int i=0; i<n; i++)
cout << '*';
cout << endl;
}
n non cambierà mai il suo valore, lo stack si riempie di chiamate finchè non si riempie perchè non si esce mai dalla ricorsione.
Supponiamo che n inizialmente sia 10, se io scrivo:
codice:
int n=10;
printf("%d\n",n--); // esempio 1
n=10;
printf("%d\n",--n); // esempio 2
Nell' esempio 1 stampa 10, nell' esempio 2 stampa 9.
Questo perchè il -- messo prima della variabile è un operatore di pre decremento: prima la variabile viene decrementata, poi viene stampata.
Mentre il -- dopo la variabile è un operatore di post decremento: prima viene stampata la variabile, poi viene decrementata.
Cosa analoga per l' operatore +.
Per cui se tu chiami:
Prima termina la chiamata ricorsiva di scrivi, poi decrementa n.Per cui se n è inizialmente uguale a 10, chiamerari sempre scrivi(10); la catena di chiamate non termina mai finchè vai in segmentation fault.
Puoi chiamarla invece così: