//代码1: 重复的main函数
#include
int main( )
{
return 0;
}
int main( )
{
return 1;
}
编译后,会提示main函数已有被定义过函数体的错误
c:\users\administrator\desktop\cfile\test.c(6) :
error C2084: function 'int __cdecl main()' already has a body
执行 cl.exe 时出错.
例如数学中函数是这么描述的:
y是关于x的函数 ,y=3x+2,
那么我们可以记做 y = f(x) = 3x+2
我们来看y = f(x)
return
来表示,每个函数都能只能return
1个返回值函数头head:返回值类型 函数名(【参数列表】) /*注:【】表示可选 */
函数体body:紧接在函数头下面用花括号括起来,括起来的部分就是函数体,放入自定义的语句。
int add(int a, int b) //函数头
{//花括号里面都是函数体
return a+b;
}
//代码2:
#include
int add(int, int);//add函数声明,参数的变量名可以省略,但数据类型不能省略
int sub(int x, int y) ;//sub函数声明,参数的变量名可以改变,但数据类型不能省略
int main( )
{
printf("add: %d\n",add(5,6));
printf("sub: %d\n",sub(5,6));
return 0;
}
int add(int a, int b) //函数定义
{
return a + b;
}
int sub(int a, int b) //函数定义
{
return a - b;
}
运行结果:
add: 11
sub: -1
第1部分 :#include 头文件
第2部分 :所有自定义的函数声明
第3部分 :main函数的定义
第4部分 :所有自定义函数的声明
(不推荐代码3,C语言先进入main函数,在main函数下放增加其他函数)
//代码3:
#include
int add(int a, int b) //函数定义
{
return a + b;
}
int sub(int a, int b) //函数定义
{
return a - b;
}
int main( )
{
printf("add: %d\n",add(5,6));
printf("sub: %d\n",sub(5,6));
return 0;
}
外部函数:
//代码4-1:
/*片段1:在main.c中*/
#include
extern int add(int, int);//extern 表示add()函数为外部函数
extern int sub(int x, int y) ;//extern 表示sub()函数为外部函数
int main( )
{
printf("add: %d\n",add(5,6));
printf("sub: %d\n",sub(5,6));
return 0;
}
//代码4-2:
/*片段2:在add.c中*/
[extern] int add(int a, int b) //add函数定义,extern可以省略,也可以加上
{
return a + b;
}
//代码4-3:
/*片段3:在sub.c中*/
[extern] int sub(int a, int b) //add函数定义,extern可以省略,也可以加上
{
return a - b;
}
内部函数:
函数C语言中已经存在较多函数,用户可以直接使用而不需要自己再编写;
要使用输入输出函数,在程序开头写上
#include
要使用数学函数中的如求根函数sqrt()函数或求绝对值函数abs()函数,在程序开头写上:
#include “math.h” 或 #include
常用的函数:
(1)
(2)
*思考:求算数平方根的函数sqrt( )是如何编写的?
//代码5
#include
int add(int, int);//add函数声明
int main( )
{
printf("add: %d\n",add(5));//add中只有1个实参
printf("add: %d\n",add(5,6,7));//add中有3个实参,多了1个实参
return 0;
}
int add(int a, int b) //函数定义,定义了2个形参
{
return a + b;
}
编译结果:
Compiling...
C:\Users\Administrator\Desktop\Cfile\test.c(5) : error C2198: 'add' : too few actual parameters
C:\Users\Administrator\Desktop\Cfile\test.c(6) : warning C4020: 'add' : too many actual parameters
执行 cl.exe 时出错.
调用函数时,将实参的值传递给形参,称为传值;
传值后,被调用函数也有实参的备份值,相当于赋值。
在被调用函数中修改形参的值,不影响实参的值。
在被调用函数中可以使用和调用函数中相同的变量名,但表示的是不同的变量。
//代码6
#include
void f(int x)
{
x = x - 1;
printf("被调用函数中的x=%d\n",x);
}
int main()
{
int x = 10;
f(x);
printf("main函数中的x=%d\n",x);
return 0;
}
编译运行后的结果:
被调用函数中的x=9
main函数中的x=10
- 说明:函数传值时相当于在新的函数空间中重新拷贝了一份数据
- main函数中x的值为10,传给函数f后,函数f中的x也为10,
- 但是在函数f中将x修改为9,当函数f执行完并返回main函数时,main函数中的x仍为10**
//代码7
#include
void f(int a,int b)
{
int t;
t=a;a=b;b=t;
}
int main()
{
int a=10,b=20;
f(a,b);
printf("a=%d,b=%d\n",a,b);
return 0;
}
编译运行后的结果:
a=10,b=20
说明: main函数中a和b的值分别为10和20,将其传值给函数f的a和b; 函数f中将a和b的值进行交换,并不影响main函数中的a和b.
(待施工)
变量的作用域:变量起作用的范围。
①局部变量:在函数内部或某个控制块的内部定义的变量。
局部变量的作用域:函数内部。
作用:增强了函数模块的独立性。
+ 局部变量又分为静态局部变量和局部变量,静态局部变量加关键字static
②全局变量:在函数外面定义的变量称为全局变量。
全局变量的作用域:从该变量定义的位置开始,直到源文件结束。
作用:在同一文件中,所有函数都可以引用全局变量。增强了各函数间数据的联系。
不同类型的变量被存储在内存的不同区域,变量的生命周期也不一样。
在内存中,供用户使用的存储区由程序区、静态存储区和动态存储区3部分组成。
局部变量的存储类型默认值为auto型。
全局变量的存储类型默认值为extern型(静态局部变量也属于此类)
//代码8
#include
void a();
void b();
void c();
int x=1;
main()
{
int x=5;
printf("主函数中的x=%d\n",x);
{
int x=7;
printf("主函数内部的x=%d\n",x);
}
printf("主函数中的x=%d\n",x);
a();
b();
c();
a();
b();
c();
printf("主函数中的x=%d\n",x);
}
void a()
{
int x=25;
printf("函数a中的x=%d\n",x);
x++;
printf("函数a中的x=%d\n",x);
}
void b()
{
static int x=50;
printf("函数b中的x=%d\n",x);
x++;
printf("函数b中的x=%d\n",x);
}
void c()
{
printf("函数c中的x=%d\n",x);
x++;
printf("函数c中的x=%d\n",x);
}