Gra*_*eme 3 c kr-c kernighan-and-ritchie
我正在通过K&R学习编程.到目前为止还不错,但我不清楚第1.8节(函数)中的一行代码的作用.
在1.8节中,作者向您展示了如何创建一个函数来将一个整数提升到另一个整数的幂.
我已经粘贴了下面的代码,正如书中所写的那样.一切都很好.但我不知道为什么他们把这条线包括在最上面:
int power(int m, int n);
Run Code Online (Sandbox Code Playgroud)
这本书没有提到它,除了说该程序将整数m提高到幂n.如果我从代码中删除该行,程序仍然按预期输出.
如果我理解这一点,就行了
int power(int base, int n)
Run Code Online (Sandbox Code Playgroud)
创建函数,下面的大括号定义函数.然后main下的大括号调用函数输出图表.
所以这一切似乎都有道理.但我不明白最重要的是什么.
这可能是无关紧要的,但我似乎更有可能错过了一些东西.任何人都可以告诉我为什么那条线在那里?
#include <stdio.h>
int power(int m, int n);
/* test power function */
main()
{
int i;
for (i = 0; i < 10; ++i)
printf("%d %d %d\n", i, power(2,i), power(-3, i));
return 0;
}
/* power: raise base to n-th power; n >= 0 */
int power(int base, int n)
{
int i, p;
p = 1;
for (i = 1; i <= n; ++i)
p = p * base;
return p;
}
Run Code Online (Sandbox Code Playgroud)
第一行是函数的声明.底部的代码块是函数的定义.
从1999版ISO C标准开始,在没有可见声明的情况下调用函数是非法的(违反约束); 声明必须在通话之前.
对于像这样的简单程序,您可以在定义power()之前编写完整定义main()(因为定义也提供了声明),但是对于更复杂的情况(例如递归调用),您经常需要提供单独的声明.
对于较大的程序,通常会在头文件(例如)中收集所有函数声明foo.h,并在源文件(foo.c例如)中收集相应的定义.一个#include "foo.h"指令是用来做的声明在其他文件中可见.你会在书的后面看到那种事情.
(在1990年和早期版本的C中,这是K&R2所涵盖的,有些情况下你可以在没有可见声明的情况下调用函数 - 但无论如何提供显式声明仍然是一个非常好的主意.)
顺便说一下,主程序的声明应该是真的int main(void)而不仅仅是main().
术语:"原型"是一个函数声明,它指定参数的类型.
int power(int base, int n); /* a declaration that's also a prototype */
int power(int, int); /* likewise */
int power(); /* a declaration but not a prototype */
Run Code Online (Sandbox Code Playgroud)
(参数名称在定义中是必需的,但在独立声明中是可选的.)
作为一种特殊情况,没有参数的函数的原型使用(void),因为空括号已经意味着非原型声明.int main(void)原型int main()也是如此,但事实并非如此.
非原型声明是"过时的",这意味着它们理论上可以从未来的语言标准中删除.但它们自1989年以来已经过时,即使在新的2011 ISO C标准中,委员会也认为不适合将它们删除.