一、定义跟初始化的区别
声明:可理解为预先告诉编译器实体的存在,但我们不知道它存在的位置。
char a;
定义:可理解为明确指示编译器实体的意义,有确切的空间地址
char a=5;
二、程序中的顺序点
顺序节点:指的程序语句执行过程中修改变量值的最晚时刻;
顺序点有:
1.每个完整表达式结束时;
2.&&,||,?,:以及逗号表达式的每个运算对象计算之后
3,,函数调用中对所有实际参数的求值完成之后(进入函数体之前)
三、函数的缺省认定
C语言会默认没有函数类型的函数参数为int
f(i,j)
{
}
等价于
int f(int i,int j)
{
}
经典例子:
int f(int i,j)
{
printf("%d,%d\n",i,j);
}
int main
{
int k=1;
f(k,k++);
printf("%d\n",k);
return 0;
}
最后输出结果为 2,1,2
函数的调用依赖于编译器,以顺序点来分析:
上面函数执行f(k,k++);的步骤我们可分解为:
第一步:.还没到顺序点时:i、j都为1;
第二步:当遇到顺序符“ ;”时,由于k的值已经为2,
所以返回值i=2;由于运行k++时,k的值存在记录表
的临时变量域中,所以k的值为1;
四、可变的参数列表
1、C语言中可以定义参数可变的函数
2、可变的参数列表涉及到stdarg.h、
va_list、va_start、va_end、va_arg
例子:
#include <stdio.h>
#include <stdarg.h>
float average(int n, ...)
{
va_list args;
int i = 0;
float sum = 0;
va_start(args, n);
for(i=0; i<n; i++)
{
sum += va_arg(args, int);
}
va_end(args);
return sum / n;
}
int main()
{
printf("%f\n", average(5, 1, 2, 3, 4, 5));
printf("%f\n", average(4, 1, 2, 3, 4));
return 0;
}
五、函数设计的技巧
1.尽量不要在函数中使用全局变量
2.参数名要能够体现参数的意义
3,如果参数是指针,且仅作输入参数用,则应在类型前加const,以防止该指针在函数体内意外修改
4.不要省略返回值类型,没有返回值时,要用void声明