語法錯誤拆解:函數不能有兩組參數列表
錯誤代碼
double p(int n)(int x); // ❌ 語法錯誤
double p(int n)(int x) { ... } // ❌ 定義也錯
錯誤原因
- C 語言函數聲明/定義**只能有一組參數列表** (圓括號)。
p(int n)(int x) 被解析為:函數 p 接受 int n,**返回函數指針**,該指針指向接受 int x 返回 double 的函數 —— 這是**函數返回函數指針**的聲明寫法,但 C **不支持函數返回函數** (只能返回函數指針),且此處語法混淆了聲明與調用。
- 若意圖是二維陣列/函數表,正確寫法見下文。
可能的原始意圖與正確寫法
意圖 1:兩個參數的函數
double p(int n, int x); // ✅ 正確:接受 n 和 x
double p(int n, int x) { return n + x; }
意圖 2:返回函數指針 (高階函數模擬)
// 類型定義:指向「接受 int 返回 double」函數的指針
typedef double (*FuncPtr)(int);
// 返回函數指針
FuncPtr get_func(int n) {
if (n == 0) return func_a;
else return func_b;
}
double func_a(int x) { return x * 1.0; }
double func_b(int x) { return x * 2.0; }
// 使用
FuncPtr f = get_func(1);
double result = f(10); // 調用返回的函數指針
意圖 3:遞歸函數 (如勒讓德多項式 P_n(x))
// 原代碼邏輯似乎是計算 P_n(x)
double legendre(int n, int x) {
if (n == 0) return 1;
if (n == 1) return x;
return ((2*n - 1) * x * legendre(n-1, x) - (n-1) * legendre(n-2, x)) / n;
}
其他錯誤
main() 缺返回類型 → int main(void)。
scanf("%d,%d", &n, &x) 要求輸入逗號,建議 "%d %d" 允許空白分隔。
printf("%lf", p(n)(x)) 若 p 修正為兩參數函數,應為 p(n, x)。
修正後完整可運行代碼 (遞歸勒讓德)
#include <stdio.h>
double legendre(int n, int x) {
if (n == 0) return 1.0;
if (n == 1) return (double)x;
return ((2.0*n - 1.0) * x * legendre(n-1, x) - (n-1) * legendre(n-2, x)) / n;
}
int main(void) {
int n, x;
printf("輸入 n x: ");
if (scanf("%d %d", &n, &x) != 2) return 1;
printf("P_%d(%d) = %f\n", n, x, legendre(n, x));
return 0;
}