C语言的其他专题
可变长的实参列表
l va_list:该类型适合于保存宏va_start、va_arg和va_end所需的信息,为了访问到一个可变长实参列表中的实参,必须声明一个类型为va_list的对象;
l va_start:在一个可变长实参列表中的实参被访问之前,先要调用这个宏,这个宏的功能是:初始化用va_list声明的对象,以便让宏va_arg和va_end来使用;
l va_arg:这个宏展开成一个表示可变长实参列表中下一个实参的值和类型的表达式,每次对va_arg的调用都要修改va_list声明的对象,已使这个对象指向列表中的下一个实参;
l va_end:当一个函数的可变长实参列表时通过宏va_start来引用时,宏va_end可用于从这样的函数中正常返回。
//using variable-length argument lists
#include <stdio.h>
#include <stdarg.h>
double average(int i,…);//prototype
int main(void)
{
double w = 37.5;
double x = 22.5;
double y = 1.7;
double z = 10.2;
printf("%s%.1f\n%s%.1f\n%s%.1f\n%s%.1f\n\n",
"w = ",w,"x = ",x,"y = ",y,"z = ",z);
printf("%s%.3f\n%s%.3f\n%s%.3f\n",
"The averange of w and x is ",average(2,w,x),
"The averange of w , x and y is ",average(3,w,x,y),
"The averange of w , x ,y and z is ",average(4,w,x,y,z));
return 0;
}
double average(int i,…)
{
double total = 0;
int j;
va_list ap;//stores information needed by va_start and va_end
va_start(ap,i);//initializes the va_list object
for(j=1;j<=i;j++)
total += va_arg(ap,double);
va_end(ap);//clean up variable-length argument list
return total/i;
}
执行效果为:
atexit函数接收一个指向某个函数的指针即函数名作为实参,该函数将在程序正常结束之时被调用。这个可以写一些结束语什么的。
关于文件的深入讨论
C语言访问文件可以通过二进制的模式或者文本文件的模式,有些计算机不支持二进制文件,而此时如果程序员又使用二进制模式打开的话,那么这个文件将被作为文本文件处理。
l 在要求高性能的场合,可以考虑采用二进制文件而不是文本文件;
l 如果要编写可移植的程序,最好使用文本文件。