vlambda博客
学习文章列表

容易忽略的C语言知识点细节(1)

「今天是学习C语言第 48 天」


当你选择了一种语言,意味着你还选择了一组技术、一个社区。——Joshua Bloch

一条长语句需要换行写,可以在行的末尾加入反斜杠 \ 表示;宏都是单行定义,如果多行定义,也是用反斜杠 \ 表示。

例如:

    #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函数可以不带参数,也可以带两个参数,带参数时,执行程序时可以实现命令行参数功能。

例如:

   #include <stdio.h> 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。

例如:

 #include <stdio.h> 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请赏个 赞    点击右下角 在看」