首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言函數聲明語法錯誤分析:double p(int n)(int x) 是什麼鬼?

     編輯:C 語言問答

語法錯誤拆解:函數不能有兩組參數列表

錯誤代碼

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;
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved