|
一、认清函数的真相
1、函数的由来
程序 = 数据 + 算法
C程序 = 数据 + 函数
2、函数的意义
模块化程序设计
 
C语言中的模块化

3、面向过程的程序设计
# 面向过程是一种以过程为中心的编程思想
# 首先将复杂问题分解为一个个容易解决的问题<??http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+o6OhobfWveK5/brztcTOysziv8nS1LC01dWyvdbo0ruyvbK9zeqzyTwvcD4KPHA+o6Ohobqvyv3Kx8Pmz/K5/bPM1Nqjw9Pv0dTW0LXEzOXP1jwvcD4KPHA+o6Ohob3ivvbOyszitcTDv9K7uPayvdbov8nS1NPDuq/K/cC0yrXP1jwvcD4KPHA+M6GiyfnD97rNtqjS5TwvcD4KPHA+o6OhobPM0PLW0LXEyfnD97/J0tTA7b3izqrUpM/IuObL37Hg0uvG98q1zOW1xLTm1NqjrMjno7qx5MG/o6y6r8r9o6y1yLXIPC9wPgo8cD6jo6Ghs8zQ8tbQtcS2qNLlw/fIt9a4yr6x4NLrxvfKtczltcTS4tLlPC9wPgo8cD7J+cP3us22qNLlsqKyu8/gzayjoaOho6E8L3A+CjxwPsq1wP2jujwvcD4KPHA+Ly8gZ2xvYmFsLmM8YnI+Ci8vIGludCBnX3ZhciA9IDA7IC8vILao0uU8L3A+CjxwPjxicj4KI2luY2x1ZGUgPHN0ZGlvLmg+PC9wPgo8cD48YnI+CmV4dGVybiBpbnQgZ192YXI7IC8vyfnD99K7uPbN4rK/seTBvzxicj4KPGJyPgp2b2lkIGYoaW50IGksIGludCBqKTsgLy/J+cP30ru49s3isr+6r8r9PGJyPgo8YnI+CmludCBtYWluKCk8YnI+Cns8YnI+CiAgICBpbnQgZyhpbnQgeCk7PGJyPgogICAgPGJyPgogICAgZ192YXIgPSAxMDs8YnI+CiAgICA8YnI+CiAgICBmKDEsIDIpOzxicj4KICAgIDxicj4KICAgIHByaW50Zig="%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; } 4、函数参数
# 函数参数在本质上与局部变量相同,都是在栈上分配空间
# 函数参数的初始值是函数调用时的实参值
 实例: #include
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;
}
函数参数的求值顺序依赖于编译器的实现!!! C语言中大多数运算符对其操作数求值的顺序都是依赖于编译器的实现的!!! int i = f() * g(); //这里可不要盲目的认为先计算f()再计算g()??? 5、程序中的顺序点 # 程序中存在一定的顺序点 # 顺序点指的是执行过程中修改变量值的最晚时刻 # 在程序达到顺序点的时候,之前所做的一切操作必须反映到后续的访问中 # 每个完整表达式结束时 # &&,||, ?:,以及逗号表达式的每个运算对象计算之后 # 函数调用中对所有实际参数的求值完成之后(进入函数体之前) #include
int main()
{
int k = 2;
int a = 1;
k = k++ + k++;
printf("k = %d\n", k);
if( a-- && a )
{
printf("a = %d\n", a);
}
return 0;
}
函数的缺省认定 # C语言会默认没有类型的函数参数为int f(i, j) { return i + j; } 等价于
int f(int i, int j) { return i + j; } 小结: 1、C语言是一种面向过程的语言 2、函数可理解为解决问题的步骤 3、函数的实参并没有固定的计算次序 4、顺序点是C语言中变量改变的最晚时机 5、函数定义时参数和返回值得缺省类型为int
|