C语言简介:
BCPL->newB->C->UNIX->Minix->Linux->gcc
C语言诞生于1970 -
1973年,在肯.汤普逊和丹尼斯.里奇的主导编写下完成,归属于美国贝尔实验室。 C语言专门为了编写操作系统而诞生的语言,所以天生适合硬件编程,以运行速度快而著称,也非常适合实现数据结构与算法。 由于出现的时间过早,C语言是存在非常多的缺陷,也没想到普通人也能使用C语言编程,因此就存在陷阱,但是前辈们都总结了一些避免的经验《C语言的陷阱与缺陷》C语言三剑客。 C语言的语法很自由,也意味着危险,自由源于自律

    C89语言标准,gcc默认的语法标准
    C99语法标准,对C89标准的扩展和增强 -std = gnu99
     C11语法标准,全新的升级

一、第一个C程序

#include <stdio.h>
程序员所写的代码并不是标准的C代码,需要一段程序把它翻译成标准的C代码,负责翻译的程序叫做预处理器,翻译的过程叫做预处理,被翻译的语句叫做预处理指令。
    #include 的功能是把一个头文件导入到当前文件中
    #include <> 从系统的路径下加载头文件
    #include "" 先从当前路径下加载头文件,如果找不到再从系统指定的路径下加载头文件
    操作系统是通过设置环境变量来指定下载头文件的路径
stdio.h
    头文件:以.h结尾。里面存储的是一些辅助性代码,绝大部分是函数的声明
    源文件:以.c结尾,里面存储的是功能性的代码
    C语言标准委员会为C语言以函数形式提供了一些基础功能,这些函数被封装到了libc.so库中
    用很多头文件负责对库中的头文件继续分类说明,stdio.h就是其中的一个,常用的还有stdlib.h  string.h
    stdio.h 负责对输入输出功能的函数进行说明

int main(int argc, const char *argv[])
{
    printf("hallo world!\n");
    return 0;
}



main函数:function
C语言以函数为单位来管理代码,是管理代码的最小单位,一个函数就是一段具有某项功能的代码段
main 函数是程序的执行入口,有且只有一个
int 是一种数据类型,它表示main函数的执行结果是一个整数
return 功能有两个:1、结束函数的执行 2、返回一个数据给函数
main函数是有操作系统调用,它的返回值给操作系统的,反映了程序是怎么样结束的,通常有三种情况:
    正数   出现异常  (别人的错误)
    0     一切正常   
    负数   出现错误  (自己的错误)
可以通过 echo $? 命令查看上一个程序的返回值

printf/scanf 是标准库中的函数,负载输出/输入数据,一般用来调试代码
        //printf("--------\n");

转义字符:
    键盘上一些特殊的按键是没有符号的,用一些特殊的字符组合来表示,这些特殊的字符组合就是转义字符,\n就是其中一个
    \n 换行
    \b 退一个字符 // \b \b
    \r 回到行首
    \t 制表符,用于对其数据
    \a 铃响
    \\ 表示一个\
    %% 表示一个%
C语言以分号作为一行代码的结束,使用大括号划分代码区域

二、编译器
负责把人能看得懂的记录了代码的文本文件,翻译成计算机能看懂的二进制文件,由预处理器、编译器、连接器
gcc是由GNU组织为了编译Linux内核的代码而开发的一款免费、开源的编译器,默认采用C89标准,-std = gun99 可以设置语法标准

    常用参数:
        -E  显示预处理的结果
        -c  只编译不连接
        -o  设置编译结果的名字
        -I  指定头文件的加载路径
        -S  生成汇编代码
        -l  指定要使用的库文件  -lm 
        -Wall  以跟严格的方式检查代码,尽可能多的显示警告
        -Werror  把警告当做错误处理

三、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语言的文件类型:
    .h  头文件
    .h.gch  头文件的编译结果,他会被优先使用
    .c  源文件
    .i  预处理文件
    .s  汇编文件
    .o  目标文件
    .a  静态库文件
    .so 共享库文件

四、数据类型
为什么要对数据进行分类?
1、现实社会中的数据就是自带类别属性
2、对数据进行分类可以节约存储空间、提高运行效率

存储空间的单位:
Bit     比特    一个二进制位,只能存储0或者1,计算机存储数据的最小单位
Byte    字节    八个二进制位,计算机存储数据的基本单位
Kb      1024B
Mb      1024Kb
Gb      1024Mb
Tb      1024Gb
Pb      1024Tb


C语言中数据分为两大类:自建(程序员自己设计的:结构、联合、类)和内建(C语言自带的)

注意:可以使用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位整数

    注意:signed 不加就代表加


    无符号:unsigned
        unsigned char         1       -128~128
        unsigned short        2       -32768~32768
        unsigned int          4       0~40亿
        unsigned long         4/8     
        unsigned long long    8       0~以1开头的20位整数

    注意:由于定义无符号的数据时比较麻烦,标准库把这些无符号的类型重新定义成了一下类型:
        使用时需要包含头文件:stdint.h
        uint8_t uint16_t uint32_t uint64_t
        int8_t int16_t int32_t int64_t





浮点型:
    float           4
    double          8   
    long double     12/16

    注意:采用科学计算方法,二进制与真实数据之间需要进行换算,一次浮点型数据耗时要比整型数据多得多,编程时尽量选择整型
    小数点后六位有效

    time ./a.out 计算运行时间


模拟型:
    字符型char
        字符其实就是符号或图案,内存中存储的是整数,当需要显示成字符时会根据ASCII码表中对应的关系显示出相应的符号或图案
        '/0'    0
        '0'     48
        'A'     65
        'a'     97

    布尔型bool
        现有C语言之后才有了bool类型,所以C语言中没有真正的bool类型,stdbool.h头文件对布尔类型进行了模拟
        bool true false

五、变量与常量
什么是变量:程序在运行期间数据可以变化的叫做变量,相当于存储数据的盒子
定义:
类型 变量名;
取名规则:
1、由字母、数字、下划线组成
2、不能以数字开头
3、不能与32个C语言的关键词重名
4、见名知意(功能、类型、范围...)
printf scanf bool sizeof

    使用:
        赋值:          num=100;
        参与运算:      num*10;
    注意:在C语言中,变量的默认值是随机的,为了安全起见要进行初始化,一般初始化为0


    变量的输入、输出;
        int printf(const char *format, ...);
        功能:输出数据
        format:"双引号包含的格式信息(信息提示+占位符)"
        ... :变量列表
        返回值:输出字符的个数

        类型占位符:C语言通过类型占位符的方式来传递变量的类型
        %hhd  %hd  %d  %ld  %lld    有符号 char short int long     long long
        %hhu  %hu  %u  %lu  %llu    无符号
        %f  %lf  %LF
        %c  %s 


        练习1:通过定义各种类型的变量并初始化,使用printf来显示
            int num_i = 0;
            printf("num=%d   %d\n",num_i,num_i);




        int scanf(const char *format, ...);
        功能:输入数据
        format:"双引号包含的格式信息(占位符)"
        ... :  变量地址列表
        返回值: 成功输入的变量个数
        注意:scanf需要的是变量类型、变量地址
                变量地址 = &变量名

        练习:定义各种类型的变量并初始化,使用scanf输入,printf输出