1.声明与定义
extern int a;
声明的a为全局变量(即使声明在函数体内)。
2.函数参数的求值顺序依赖编译器的实现(最好不写K,填入值)
K=k++ + k++;(后置操作不会立即反应到K;而前置++k立即实现反应到k)
K=2 + 2 ; k=6;
顺序点:1)&& || ? ; 以及逗号表达式的每个运算之后
2)函数调用中对所有实际参数的求值完成之后(进入函数之前)
i的值为从内存k处取,j的值为k先付给j然后在++。
3.函数缺损
C语言默认没有类型的函数参数为int
4.可变参数(实现依赖于stdarg.h)
1)可变参数必须从头到尾按照顺序一一访问
2)至少存在一个确定的命名参数
3)无法判断参数数量
4)无法判断参数实际类型
#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;
}
5.宏与函数
宏可以包含类型(int);
#define MALLOC(A,B) (A*)malloc(sizeof(A)*B)
宏的效率高,易出错;
函数效率低,不易错。
6.调用约定(使用.so库文件时,调用不同的开发者函数)
7.递归
需要一个出口,否则栈会溢出;
必须有判断语句(if)。
8.函数规范
1)函数中,如果参数为指针,且作为输入参数,该参数类型前加const;
2)不可忽略返回类型,void
3)返回值不可为“栈内存”的指针。
4)函数体尽量在80行代码之内;
5)尽量少用static变量