c语言基础1—编译链接、整型、枚举、常量、预处理、typedef

来源:互联网 发布:中国gdp历年数据 编辑:程序博客网 时间:2024/05/02 00:02


一、编译和链接

        程序想要运行必须将原文件通过编译转化为目标文件,然后各个目标文件通过链接器链接在一起形成一个可执行的独立程序,在链接的过程中也链接系统自带的函数库。编译只会检查有没有语法错误,链接会检查是否有main函数,咩有则编译失败;

1、编译一个源文件cc  panda.c这条命令产生一个称谓a.out的可执行程序。中间会生成一个panda.o的目标文件,但在链接过程完成后会被删除;

2、编译多个源文件cc  panda.c  monkey.c  ape.c 此时目标文件不会被删除,以备对改动过的文件进行重新编译。

3、编译一个源文件并与其他目标文件链接在一起 cc  panda.o  monkey.o  ape.c

4、 编译一个文件并产生目标文件 cc -c  panda.c

5、 链接几个目标文件 cc panda.o  monkey.o  ape.o

6、更改可执行文件的名称 cc panda.c -o  panda.out

7、运行程序 ./a.out


二、数据

在c语言中只有四种基本数据类型——整型、浮点、指针、聚合类型(如数组、结构、共用、枚举)

1、整型

1)整型包括字符、短整型、整型、长整型,他们都有<有符号>和<无符号>两个版本。

2)具体长度感觉无需特别纠结,只需要知道无符号的范围一定是正数,长整型至少和整型一样长,整型至少和短整型一样长,short和long两个修饰付用来修饰int即可;

3)char、 singned char、unsigned char

4)类型行说明符short,long只能修饰整型int,它会改变整型的位数。并且可以和signed,unsigned配合使用。short int、unsigned short int、int 、unsigned int、long int 、unsigned long int

5)所占的字节数与类型有关也与编译器环境有关

 16位编译器32位编译器64位编译器char111int244float444double888          

 2、枚举类型

1)枚举类型就是指它的值为符号常量而不是字面值的类型。

2) 例;enmu sex {man, woman}; enum sex x = man; enum sex y = woman;

3)枚举实际是以整型方式存储的,0、1以此类推负值。

4)  也可以给这些符号名给定一个值:enum  fruit {apple = 10, grape = 20 ,peach = 30};



3、常量 

1)常量的样子和变量一样,只是他们的值不能修改(字符常量、整型常量、单双精度常量、字符串常量)。

2)constint  a = 10;    const  char  a = ‘A’;    const char *a = “A”;    const  double a = 0.0 。

3)   给常量负值有两种方法:首先,你可以在声明是给它初始化。其次,在函数中声明为const的行参在函数调用时会得到实参的值。

4)const变量只用于允许使用变量的地方

5)(预处理指令)#define指令是另一种创建名字常量的机制


4、typedef

1)允许为各种数据类型定义新名字,例如:typedef char *String给字符串定义一个别名;

2)对比char *String; 这行为定义一个指向字符串的指针String;

3)枚举 1enmu sex {Man ,Woman}  2#typedef enum sex mySex;

4)指向函数的指针 1int (*p) (int, int) = sum; 2typedef int (*myPoint)(int, int);  3myPoint p = sum指向sum函数的指针;4sum函数为int sum(int a, int b);

5)指向结构体指针1struct student stu1 ={1,’A’};2struct student *stu = &stu1; 3typedef struct  student * stuPoint;  4stuPoint stu = &stu1;

4)下面是给结构体起别名的三种方法;

[java] view plai
  1. #typedef struct student  {
  2. int a;
  3. char b;         
  4. } stu; 
  5. //上面的结构体做了两件事:即给结构体定义了一新的名称,又定义了一个结构student类型;
  6. //上面定义的结构体,定义变量的两种方法 1stu student1; 2struct student student2;

  7. #typedef struct {
  8. int a ;
  9. char b;
  10. } stu;//这种方法只给结构体定义了别名

  11. struct student {
  12. int a;
  13. char b;
  14. };//定义结构题
  15. #typedef student stu;//给结构体定义别名


5、预处理指令

1)在代码翻译成0跟1之前执行预处理指令

2)预处理指令都是以#开头的

3)预处理指令包括 1宏定义(带参数的宏,不带参数的宏) 2条件编译 3文件包含

4) #include即为文件包含,当在一个文件中需要用到另外一个文件的函数时,就需要文件包含。需要注意的是不允许循环包含,即你包含我,我包含你,这样会报错;

5)重复包含一个头文件,会加重编译起的负担,解决办法在头文件中加入同时保证宏名唯一:1#ifndef ABC  2#define ABC 123 ……  3#endif

6)#define COUNT 30:在代码翻译之前,把代码里面的所有COUNT变成30 。

7)#undef COUNT 代表:取消宏定义。

8)带参数的宏定义: #define sum(a,b)  ((a)+(b)) ,带参数的宏定义,要尽量加上括号以防止由于运算优先级导致错误;带参数的宏定义比函数的效率高,简单的函数可以写成宏定义,但宏定义只是文本替换,不会进行任何计算;

9)条件编译其他用法1#ifdef A (#if defined(A) )  …… 2#endif ;1#ifndef A(#if !define(A))   ……2#endif;参见5

10)条件编译代码如下:

[java] view plaincopy
  1. #define A 10 //定义不带参数的宏10,宏名要大写,或者以k开头驼峰标示写
  2. int main()
  3. {
  4. #if(A == 10)//当宏等于10时编译下面代码,其余不参与编译,条件编译实在代码翻译前进行判断,所以此处不能用变量
  5. printf(“A == 10”);
  6. #elif(A == 5)   //代码在判断的时候,不用加括号;
  7. printf(“A == 5”);
  8. #else
  9. printf(“A == 0”);
  10. #endif //有#if一定要有#endif

  11. return 0;
  12. }


6、作用域代码如下

[java] view plaincopy
  1. int main()
  2. {
  3. {
  4. //函数的作用域与变量的作用域相同,函数也可以说是代码块
  5. //变量的作用域,从定义的那行开始到代码块结束
  6. //变量a在这个代码块执行结束后就销毁
  7. int a = 0;
  1. }
  2. int score = 20;
  3. {
  4. //代码块里面的变量与外面的变量不冲突
  5. int score = 10;
  6. //默认输出值为10,但在这个代码块里没有定义变量score的时候,会向外部寻找变量socre即20那变量也是可以访问到的,此为就近原则
  7. printf(“%d”, score);
  8. }
  9. //这个变量score输出时函数内部的变量值20
  10. printf(“%d”, score);//



0 0