首页 > 解决方案 > 我在 C 编程中遇到错误。([Error] 预期标识符或 '(' 在 '{' 标记之前) 。有人可以帮我解决一下,让我知道为什么吗?

问题描述

//使用递归的阿克曼函数

    #include<stdio.h>
    int ack(int,int);
    int main(void)
    {
        int m,n;
        printf("Enter values for m and n:\t");
        scanf("%d%d",&m,&n);
        printf("The answer is %d\t",ack(m,n));
        return 0;
    }
     int ack(int m,int n);


     {

        if(m==0)
          return n+1;
        else if(m>0&&n==0)
          return ack(m-1,1);
        else if (m>0 && n>0);
          return ack(m-1,ack(m,n-1));
     }

//[错误]- 预期标识符或 '(' 在 '{' 标记之前)

标签: crecursioncompiler-errorsfunction-definition

解决方案


您有一个额外的分号需要删除。

的前向声明ack需要分号,但是在定义函数时,参数列表和 : 之间不能有分号{

#include<stdio.h>
int ack(int,int);
int main(void)
{
    int m,n;
    printf("Enter values for m and n:\t");
    scanf("%d%d",&m,&n);
    printf("The answer is %d\t",ack(m,n));
    return 0;
}
 int ack(int m,int n);   /* <------   REMOVE THIS SEMI-COLON */


 {

    if(m==0)
      return n+1;
    else if(m>0&&n==0)
      return ack(m-1,1);
    else if (m>0 && n>0);  /* <--- Also (probably) here */
      return ack(m-1,ack(m,n-1));
 }

我上面评论中提到的第二个分号不是语法错误,删除它会改变语义。实际上,在这种情况下,删除它可能会导致编译器警告缺少返回。但是,该分号对任何阅读代码的人都具有极大的误导性,为了便于阅读,应该将其删除。如果这确实是你想要的语义,你应该把它单独放在一行上,并从它后面的返回中删除一个缩进级别。


推荐阅读