函数的由来
程序= 数据+ 算法
C程序= 数据+ 函数
函数的意义
模块化程序设计
难以解决的
复杂问题
复杂问题1 复杂问题2
简单问题1 简单问题2 简单问题1 简单问题2
面向过程的程序设计
面向过程是一种以过程为中心的编程思想
首先将复杂的问题分解为一个个容易解决的问题
分解过后的问题可以按照步骤一步步完成
函数是面向过程在C语言中的体现
解决问题的每个步骤可以用函数来实现
声明和定义
程序中的声明可理解为预先告诉编译器实体的存
在,如:变量,函数,等等
程序中的定义明确指示编译器实体的意义
声明和定义并不相同!!!
// global.c
// int g_var = 0;
#include <stdio.h>
extern int g_var;
void f(int i, int j);
int main()
{
int g(int x);
g_var = 10;
f(1, 2);
printf("%d\n", g(3));
return 0;
}
void f(int i, int j)
{
printf("i + j = %d\n", i + j);
}
int g(int x)
{
return 2 * x + g_var;
}
函数参数
函数参数在本质上与局部变量相同,都是在栈上分配空间
函数参数的初始值是函数调用时的实参值
#include <stdio.h>
int f(int i, int j)
{
printf("%d, %d\n", i, j);
}
int main()
{
int k = 1;
f(k, k++);
printf("%d\n", k);
return 0;
}
输出 2,1
2
函数参数
函数参数的求值顺序依赖于编译器的实现!!!
C语言中大多数运算符对其操作数求值的顺
序都是依赖于编译器的实现的!!!
int i = f() * g();
程序中的顺序点
程序中存在一定的顺序点
顺序点指的是执行过程中修改变量值的最晚时刻
在程序达到顺序点的时候,之前所做的一切操作必须反映
到后续的访问中
C语言中的顺序点
每个完整表达式结束时
&&, ||, ?:, 以及逗号表达式的每个运算对象计算之后
函数调用中对所有实际参数的求值完成之后(进入函数体之前)
#include <stdio.h>
int main()
{
int k = 2;
int a = 1;
k = k++ + k++; //根据顺序点 ++操作在最后执行,4++ 再++
printf("k = %d\n", k);
if( a-- && a ) //a--在&&之前进行了--.
{
printf("a = %d\n", a);
}
return 0;
}
上面打印输出6.
函数的缺省认定
C语言会默认没有类型的函数参数为int
小结
C语言是一种面向过程的语言
函数可理解为解决问题的步骤
函数的实参并没有固定的计算次序
顺序点是C语言中变量改变的最晚时机
函数定义时参数和返回值的缺省类型为int