K& R样式函数定义中的语法错误,为什么?

时间:2017-03-14 14:12:36

标签: c syntax

#include <stdio.h>
long int faktorijal(n);
int n;
{
if (n==0)
return((long)1);
else
return(n*faktorijal(n-1)); // Recursive call
}
main()
{
int i;
for (i=0;i<=5;i++)
printf("%d! = %d\n",i,faktorijal(i));
getch();
}

给我一​​个错误&#34; [错误]预期标识符或&#39;(&#39; {&#39;令牌&#34;。

我认为它与主要功能有关,但我不确定,所以我在这里问。

faktorijal表示阶乘

编辑:只是为了展示错误的书籍。它是一本较旧的书,但我们也被教导使用getch()代替getchar或返回0。

谢谢大家,这帮了很多忙。

3 个答案:

答案 0 :(得分:7)

您正在使用K&R style。在这种情况下

 long int faktorijal(n);
 int n;

函数签名错误后的尾随;。删除它。

之后,

  • faktorijal()会返回long int,但您将返回值作为%d的参数提供,这又是错误的。您需要使用%ld
  • getch()不是标准库函数,而是使用getchar()
  • 对于托管环境,符合C标准的main()符合签名(最新,如果您认为),至少为int main(void)。隐式int规则已从标准中明确删除。

答案 1 :(得分:0)

1。功能:

long int faktorijal(n);
int n;
{
    if (n==0)
        return((long)1);
    else
        return(n*faktorijal(n-1)); // Recursive call
}

编写不正确。将其更改为:

long int faktorijal(int n)
{
    if (n == 0)
        return((long)1);
    else
        return(n*faktorijal(n-1)); // Recursive call
}

2. 也改变:

printf("%d! = %d\n",i,faktorijal(i));

到:

printf("%d! = %ld\n",i,faktorijal(i));

作为long int的说明符是%ld。说明符%d适用于int s。

3. 更改main的声明:

main(){}

到:

int main(){}

4. 最后改变:

getch();

到:

getchar();

并加入stdlib.h

答案 2 :(得分:0)

更改以下代码块:

long int faktorijal(n);
int n;
{
if (n==0)
return((long)1);
else
return(n*faktorijal(n-1)); // Recursive call
}

要:

long int faktorijal(int n) // remove semicolon from here, this is function header. Also defined data type of argument
{
    if (n==0)
        return((long)1);
    else
        return(n*faktorijal(n-1)); // Recursive call
}

定义函数时,标题和函数体的左大括号之间不应有分号。编译器期望右括号在此前面的大括号前面,这就是它产生错误的原因:

  

[错误]预期标识符或'(''''''''''''''''''''

您也忘了指定参数的数据类型。从函数参数标题中删除n,而不是在那里添加int n,如更正后的代码所示。

,您忘了正确定义main()

main()

main()函数的C ++语法要求它具有返回数据类型int。因此,将主要功能更改为:

int main()

另一件事:您的printf()语句使用了不正确的格式说明符。变化:

printf("%d! = %d\n",i,faktorijal(i));

要:

printf("%d! = %ld\n",i,faktorijal(i));

这是因为faktorijal(i)返回long int,而long int的格式说明符为%ld