一、第一个C语言程序
    1、vim xxx.c  创建.c源文件
    2、编写代码,并保存退出
    3、gcc xxx.c  编译.c源文件,成功会得到a.out可执行文件
    4、./a.out  运行可执行文件
        注意:可以合并3、4
            gcc xxx.c && ./a.out
 
    #include <stdio.h>
  程序员所编写的代码不是标准C代码,需要一段程序把它翻译成标准C代码,负责翻译的程序叫做预处理器,
  翻译的过程叫做预处理,需要被翻译的代码叫做预处理指令,以#开头的代码叫做预处理指令
        #include 功能是导入头文件
            #include <xxx.h>
                <> 从系统指定路径(/usr/include/)查找头文件并导入
            #include "xxx.h"
                "" 先从当前的工作路径查找头文件,如果找不到再从系统指定路径查找并导入
        stdio.h 
            头文件:以.h结尾,里面存放的是辅助性代码,绝大多数都是函数的说明
 
    int main()
    {
        printf("Hello World!\n");
        return 0;
    }
 
    main函数:
        C语言以函数为单位管理代码,一个函数就是一段具有某一项功能的代码段
        main函数是程序的执行入口,必须有且只能有一个
        int 是一种数据类型,它表示main函数的执行结果是一个整数
        return 功能有两个:
            1、结束函数的执行
            2、返回一个结果给函数的调用者(return返回值的取值范围是0~255) 
        main函数的调用者是操作系统,它的返回值是给了操作系统的,它的值能反应出程序是如何结束的,一般有三类:
            正数    出现异常    (别人的错误)
            0       一切正常
            负数    出现错误    (自己的错误)
 
    可以输入 echo $?  来查看mian返回的值
        
        printf/scanf   是标准库中的函数,负责输出数据、输入数据
            printf("想要输出的内容");
        转义字符:
            键盘上一些无法直接打印显示的符号,用一些特殊的字符组合来表示,这种特殊的字符组合称为转义字符,\n 就是其中之一
            \r  回到行首
            \t  制表符(一个制表区占8列),相当于Tab,用于输出格式对齐
            \b  退格键 
            \a  铃响
            \\  表示一个\
            %%  表示一个%
   *可以用\12  来表示此时为8进制需转换成十进制再通过ascII码来找到对应n,r,t,回车之类的
    \x12  此时是16进制
        
    C语言中以分号作为一行代码的结束,使用大括号划分区域
 
二、编译器
    负责把人能看得懂的记录着代码的文件,翻译成计算机能看得懂的二进制文件,由预处理器、编译器、链接器组成
    gcc是由GNU社区为了编译Linux内核代码而开发的一款免费的编译器  
    gcc常用的编译参数:
        -E  只显示预处理的结果到终端
        -std=gnu99  设置C99语法标准
        -c  只编译不链接
        -o  指定编译结果的名字 -oname或-o name
        -S  生成汇编代码
        -I  指定头文件的加载路径 -I 加载路径
        -Wall   尽可能多地产生警告
        -Werror 把警告当错误处理
        -l  指定要加载的代码库 -lm 使用数学库
 
警告可以生成可执行文件,错误不行
 
三、C代码变成可执行文件的详细过程:
    1、预处理   把源文件翻译成预处理文件
        gcc -E code.c   显示预处理结果到终端
        gcc -E code.c -o code.i 生成以.i结尾的预处理文件
    2、编译     把预处理文件翻译成汇编文件
        gcc -S code.i   生成以.s结尾的汇编文件
    3、汇编     把汇编文件翻译成二进制的目标文件
        gcc -c code.s   生成以.o结尾的目标文件
    4、链接     把若干个目标文件合并成一个可执行文件
        gcc a.o b.o c.o ...   默认生成a.out可执行文件
 
每个步骤不是必须要经过可以直接步骤三再步骤四
 
四、C语言的文件类型:
    .c  源文件
    .h  头文件
    .h.gch  头文件的编译结果文件(gcc xxx.h),它会被优先使用--->如果后面更改了.h文件内的内容仍然会优先执行.h.gch文件
    .i  预处理文件
    .s  汇编文件
    .o  目标文件
    .a  静态库文件
    .so 共享库文件
 
五、存储空间的单位:
    Bit  比特  一个二进制位,只能存储0或者1,计算机中存储数据的最小单位
    Byte 字节  八个二进制位,计算机存储器描述存储容量的基本单位
    KB   1024字节
    MB   1024KB
    GB   1024MB
    TB   1024GB
    PB   1024TB
 
六、数据类型
    为什么要对数据进行分类?
        1、现实生活中的数据本身就自带类别属性
        2、对数据进行分类可以节约存储空间、提高运行速度
 
    C语言中数据分类为两大类:自建(程序员自己设计的类型:结构、联合、类)和内建(C语言自带的类型)
        注意:运算符 sizeof 可以计算类型、变量的字节数 --->  sizeof((int)a+1.0)---->8  但是只计算结果的sizeof并不参与运算结果中  
        整型:
            signed  有符号
                signed char     1       -128~127 
                signed short    2       -32768~32767
                signed int      4       正负20亿
                signed long     4/8
                signed long long   8    正负9开头19位整数
            unsigned 无符号
                unsigned char     1      0~255
                unsigned short    2      0~65535
                unsigned int      4      0~40亿
                unsigned long     4/8
                unsigned long long   8   0~1开头20位整数
            注意:signed不加就代表了加
                  由于定义无符号整型时比较麻烦,C标准库把这些类型重定义成一些新的简单的类型名:
                    需要导入头文件<stdint.h>
                uint8_t uint16_t uint32_t uint64_t
                int8_t int16_t int32_t int64_t
                
        浮点型: 有小数部分的类型
            float   单精度      4  有效数字7
            double  双精度      8 有效数字15
            long double        12/16
            注意:小数点后默认输出六位,但不一定有效
            注意:采用一定的算法对真实的浮点型数据到二进制数据进行转换,这个过程比存储、读取整型要慢得多,编程时尽量使用整型数据
    double num(如何判断一个double类型变量的值是否等于0?)
因为浮点型数据存储是不精确(十进制小数如何转化为二进制?)的,所以不能直接判断: num == 0
    if(num < 0.000001 && num > -0.000001) 
if(abs(num)<0.000001)
        模拟型:
            字符型:char 单引号括起来的单个字符(注意转移字符的含义)
                字符就是符号或图案,在内存中存储的依然是整数,需要显示出字符时,会根据ASCII表中对应的关系显示出对应的字符或图案
                '\0'    0   特殊字符
                '0'     48 
                'A'     65
                'a'     97  
 
转移字符可以用数字表示,比如:'\12'
 
            布尔型:bool
                 先有的C语言后有的bool类型,所以C语言中不可能有真正的布尔类型,在头文件stdbool.h 中对布尔类型进行了模拟
                    bool true false
 
bool类型变量占1个字节,但是true和false占4个字节
 
七、变量与常量
    什么是变量:程序运行期间数值可以发生变化的叫做变量,相当于一个存储数据的盒子
    定义:  类型名 变量名; 
            int num;  
            取名规则:
            1、由字母、数字、下划线组成
            2、不能以数字开头,不能与C语言32个关键字重名(能默写)
            3、区分大小写
printf scanf bool true sizeof
            4、见名知意 (功能、类型、作用范围...)
    注:
      有些特殊情况
      eg:int printf;--->这个声明是正确的,但是我们后续使用printf("xxxx");时这个输出函数就会失效
      eg:int true;---->当没有#include<stdbool>时这样使用是没问题的;但是一旦引用之后这个声明就成了错误的。
    
    使用:
        赋值:  变量名 = 10;
                num = 10;
        参与运算:  2+(变量名*10);
                2+(num*10);
        注意:C语言中变量的初始值是随机的,为了安全起见,一般在定义时初始化为0
 
    变量的输出与输入:
        int printf(const char *format, ...);
        功能:输出数据
        format:"双引号包含的提示信息+占位符"
        ...:变量名列表
        返回值:输出字符个数
 
        类型占位符:C语言中通过类型占位符传递变量的类型
            signed char    short   int     long    long long     
                %hhd          %hd   %d     %ld        %lld
        unsigned char  short     int   long  long long  
                %hhu        %hu     %u   %lu     %llu
        float   %f
        double  %lf
        long double %LF
        字符型 char %c
 
        int scanf(const char *format, ...);
        功能:输入数据
        format:"双引号包含的占位符"
        ...:    变量地址列表
        返回值:成功输入的变量的个数
        注意:scanf需要提供变量的地址  
            &变量名 == 变量地址
        
    
    什么是常量:程序运行期间数值不能改变的叫做常量
        100     默认int类型
        100l    long
        100ll long long
        100u    unsigned int
        100lu   unsigned long
        100llu  unsigned long long
        3.14    默认double
        3.14f   float
        3.14l   long double
 
八、格式化输入输出
  %nd     显示n个字符宽度,不够则补充空格,右对齐
  %-nd    显示n个字符宽度,不够则补充空格,左对齐
  %0nd   显示n个字符宽度,不够则补充0,右对齐
  %n.mf  显示n个字符宽度(小数点也算一位),不够则补充空格,m表示小数点后几位(四舍五入,不够补0),右对齐
  %g       不显示小数点后多余的0
  %e       以指数形式输出浮点数