第33节 认清函数的真面目
-------------------------------------资源来源于网络,仅供自学使用,如有侵权,联系我必删.
第一:
函数的由来
程序 = 数据 + 算法
函数的意义
C语言中的模块化
第二:
面向过程的程序设计
? 面向过程是一种以过程为中心的编程思想
? 首先将复杂的问题分解为一个个容易解决的问题
? 分解过后的问题可以按照步骤一步步完成
? 函数是面向过程在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(2,1)
f(k, k++);//依赖编译器决定,这里是从后往前顺序计算!!!!
printf("%d\n", k);
return 0;
}
函数参数的求值顺序依赖于编译器的实现 !!!
C 语言中大多数运算符对其操作数求值的顺序都是依赖于编译器的实现的 !!!
第五:
程序中的顺序点
? 程序中存在一定的顺序点
? 顺序点指的是执行过程中修改变量值的最晚时刻
? 在程序达到顺序点的时候 , 之前所做的一切操作必须反映到后续的访问中
#include <stdio.h>
int main()
{
int k = 2;
int a = 1;
k = k++ + k++;//分号为顺序点 K++自增二次要延时到达顺序点后生效
printf("k = %d\n", k);
if( a-- && a )//a--到达顺序点立即生效,a=0,后面的打印也不会生效
{
printf("a = %d\n", a);
}
return 0;
}
? 每个完整表达式结束时
? &&, ||, ?:, 以及逗号表达式的每个运算对象计算之后
? 函数调用中对所有实际参数的求值完成之后(进入函数体之前)
第六:
函数的缺省认定
C 语言会默认没有类型的函数参数为int
#include <stdio.h>
/*
int f(int i, int j)
{
return i+j;
}
*/
int f( i, j)
{
return i+j;
}
int main()
{
printf("f(i , j) = %d\n", f(1,3));
return 0;
}
小结
? C 语言是一种面向过程的语言
? 函数可理解为解决问题的步骤
? 函数的实参并没有固定的计算次序
? 顺序点是C 语言中变量改变的最晚时机
? 函数定义时参数和返回值的缺省类型为int