void reverse(int i) {
if (i > 5) exit(0);
printf("%d\n", i);
return reverse(i++); // 後置++
}
void reverse(int i) {
if (i > 5) return;
printf("%d ", i);
return reverse((i++, i)); // 逗號表達式
}
i++ 的值是遞增前的值,副作用是i變為i+1。但在函數參數傳遞時:
i++ 取值為當前ireverse(當前i)i才真正+1結果:每次遞歸傳入的都是初始值1,無限遞歸 → 棧溢出。
(i++, i) 是逗號表達式,值為最後一個子表達式的值:
i++,i 變為 i+1i 的新值作為整個表達式的值reverse(新i)結果:參數真正遞增,滿足終止條件正常退出。
// 代碼一等價於
void reverse(int i) {
if (i > 5) exit(0);
printf("%d\n", i);
int temp = i;
i = i + 1; // 副作用發生在調用後
return reverse(temp); // 永遠傳遞初始值
}
// 代碼二等價於
void reverse(int i) {
if (i > 5) return;
printf("%d ", i);
i = i + 1; // 先遞增
return reverse(i); // 傳遞新值
}
return reverse(i + 1); 無副作用,語義明確