容易忽略的C语言知识点细节(1)
「今天是学习C语言第 48 天」
一条长语句需要换行写,可以在行的末尾加入反斜杠 \ 表示;宏都是单行定义,如果多行定义,也是用反斜杠 \ 表示。
例如:
#define LONG_MACRO \
"...........很长的字符串哈........."
int i,j,k \
x,y,z;
变量有全局变量、局部变量,全局变量系统默认初始化,局部变量不会自动初始化,建议所有变量使用前,手工初始化。
基本数值类型转换有两种,一种隐式,一种显式,建议有需要类型转换的情况下,一律使用强制转换运算符 (类型)变量名 显式转换,转换的原则是从取值范围较小的类型转到取值范围较大的类型,结果值不会损失,反之结果值则损失部分值。
数组的下标是从0开始,长度为n的数组,最大下标是n-1,数组下标超出范围,越界访问是严重的错误。
数组可以作为参数(指针或数组形式)传递给函数,但是不能作为函数返回值,可以返回指向数组的指针。
例如:
int a[100]; // a数组类型,sizeof(a)==400
int *func(int a[100]); // a类型同样转化指针类型,sizeof(a)==4
int *func(int *a); // a是指针类型
sizeof(int)是求类型长度的运算符,不是函数.
函数声明中的参数名称可以省略,也可以和函数定义不一样。
例如:以下三种都是声明相同的函数func,第三种声明且定义了函数。
int func(int,int);
int func(int a, int b);
int func(int c, int d)
{
}
main函数可以不带参数,也可以带两个参数,带参数时,执行程序时可以实现命令行参数功能。
例如:
int main(int argc, char *argv[])
{
// argc 参数数量,包括程序名称
// agrv 参数字符串数组
printf("%d\n", argc);
int i;
for(i=0; i<argc; i++)
printf("%s\n", argv[i]);
}
编译以后程序名称为 test.exe
输入:test.exe arg1 arg2 arg3
输出:
4
E:\test.exe
arg1
arg2
arg3
函数类型是由函数返回值类型、函数名称、参数类型列表标识,只要三者相同则为同一个函数类型,参数名称不是。
C语言函数允许递归调用,在函数中调用自身,函数递归是将大问题化解相似的小问题去解决,函数必须设置递归调用的结束条件,一般是当化解成的小问题可以直接解决时,递归返回值。例如计算阶乘值,例如10的阶乘,化解成10*9的阶乘,9的阶乘可以进一步化解成9*8的阶乘,每次求阶乘的方式一样,只是问题大小不一样,当求最小问题1的阶乘时,就可以直接返回1。
例如:
int fac(unsigned int n)
{
if(n == 1)
return 1;
return n*fac(n-1);
}
int main()
{
printf("10的阶乘是%d\n", fac(10));
}
C语言函数支持变长参数,参数个数可以不确定,通过<stdarg.h>标准库提供支持。
位段类型空间分配规则,当一个int型无法容纳全部位段信息,就会再次分配另一个int类型,空间只会以int的整数倍分配;当int型剩余的位数无法满足当前位段成员要求,则该成员的值会直接存储到下一个int型的空间,不会跨两个int型空间存储。
参数化宏实现函数功能时,更加强大和灵活,因为没有类型限制。
例如:
#define MAX(a,b) ((a) > (b) ? (a) : (b))
返回a,b中值比较大的,a,b只要能比较大小就可以,不限定类型。
---------- End ----------
往期精彩推荐:
「喜欢C请赏个 赞 点击右下角 在看」