c - 我在 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));
}
//[错误]- 预期标识符或 '(' 在 '{' 标记之前)
解决方案
您有一个额外的分号需要删除。
的前向声明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));
}
我上面评论中提到的第二个分号不是语法错误,删除它会改变语义。实际上,在这种情况下,删除它可能会导致编译器警告缺少返回。但是,该分号对任何阅读代码的人都具有极大的误导性,为了便于阅读,应该将其删除。如果这确实是你想要的语义,你应该把它单独放在一行上,并从它后面的返回中删除一个缩进级别。
推荐阅读
- jquery - 使用jquery检查输入类型文本是否包含div中的值
- vba - Microsoft Form - 如果复选框单元格值大于
- google-cloud-functions - 在 Firebase 云功能中通过 nodemailer 发送邮件是否需要计费帐户?
- ios - 侧边菜单边框 Xamarin.iOS
- sql - 如何按字母排序,然后按数字排序?
- laravel - Laravel 和干预 - 如何禁止上传大图像
- node.js - 测试 AWS 服务未按预期工作时,我的 Node.JS 项目中的 sinon.spy
- c# - 为什么 if 语句有效但 switch 语句无效
- amazon-web-services - How do I run my CDK app?
- android - 二进制 XML 文件行在可绘制对象中膨胀类按钮时出错