C语言基础

一、C语言简介:

    BCPL->new B->C语言->UNIX->Minix->Linux->gcc

    C语言诞生于1970~1973年,在肯·汤姆逊和丹尼斯·里奇的编写下完成的,归属于美国贝尔实验室

    C语言是专门用编写操作系统而发明的编程语言,所以天生适合对硬件编程,也以运行速度快而著称,也非常适合实现数据结构和算法

    由于出现的时间过早,有很多缺陷,也存在着很多陷阱,但是我们的前辈给我们总结了一些避免陷阱的经验教训  《C陷阱与缺陷》

    C语言的语法很自由,但是也意味着危险

    自由源于自律

    第一套语法标准  C89,默认是gcc编译器的语法标准    

    第二套语法标准  C99  对C语言的扩展和增强,Ubuntu16.04默认C99    -std=gnu99      指定为C99语法标准  

    第三套语法标准  C11  全新的升级

二、第一个C语言程序

    1、vim xxx.c    创建.c文件

    2、编写代码并保存退出

    3、gcc xxx.c    编译源文件,编译成功会得到a.out(可执行文件)

    4、./a.out      运行可执行文件      可以合并3、4        gcc xxx.c && ./a.out            &&  前面为真在执行后面

    #include<stdio.h>

        程序员所编写的代码不是标准C代码,需要一段程序把它翻译成标准C语言,

        负责翻译的程序交做预处理器,翻译的过程叫做预处理,需要被翻译的代码叫做预处理指令,以#开头的代码叫做预处理指令

        #include 功能是导入头文件

            #include<xxx.h>(系统头文件)

                <>从系统指定路径查找头文件并导入

            #include"xxx.h"(自己写的头文件)

                ""先从当前的工作路径查找头文件,如果找不到,再从系统指定路径查找并导入

        stdio.h

            头文件:以.h结尾,里面存放的是辅助性代码,绝大多数都是函数的说明

    int main()

    {

        printf("Hello,world!\n");

        return 0;

    }

        main函数:function

            C语言一函数为单位管理代码,一个函数就是一段具有某一项功能的代码段

            main函数是程序的执行入口,必须有且仅有一个

        int 是一种数据类型,它表示main函数的执行结果是一个整数(-21~21)

        return功能:

            1、结束函数的执行

            2、返回一个结果给函数的调用者

        main函数的调用者是操作系统,他的返回值是给了操作系统的,它的值能反映出程序是如何结束的,一般有3类:

            0       一切正常

            正数    出现异常(别人的错误)

            负数    出现错误(自己的错误)

        printf/scanf    是标准库中的函数,负责输出/输入数据

            printf("想要输出的内容")


 

        转义字符:

            键盘上一些无法直接打印显示的符号,用一些特殊的字符组合来表示,这种特殊的字符组合成为转义字符,\n就是其中之一

            \r  回到行首

            \t  制表符,相当于Tab,用于输出格式对齐

            \b  退格键

            \a  铃响

            \r  表示一个\

            %%  表示一个%

        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  头文件的编译结果文件,它会被优先使用

    .i  预处理文件

    .s  汇编文件

    .o  目标文件

    .a  静态库文件

    .so 共享库文件


 

六、存储空间的单位:

    Bit     比特    存储一个二进制位,只能存储0或者1,计算机中存储数据的最小单位

    Byte    字节    存储八个二进制位,计算机存储器描述存储容量的基本单位

    KB      1024字节

    MB      1024KB

    GB      1024MB

    TB      1024GB

    PB      1024TB


 

七、数据类型:

    为什么要对数据进行分类?

        1、现实生活中的数据本身就自带类别属性

        2、对数据进行分类可以节约存储空间、提高运行速度

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

        注意:运算符 sizeof 可以计算类型、变量的字节数

        内建:

            整型:

                signed      有符号的整数     例:11010111    最高位为符号位  

                    signed char     1个字节                             -128-127

                    signed short    2个字节                             -32768-32767

                    signed int      4个字节                             ±20亿左右

                    signed long     4或8个字节(取决于操作系统的位数)    ±20亿左右/±9开头的19位整数

                    signed long long 8个字节                            ±9开头的19位整数

                unsigned    无符号类型的整数 例:11010111    最高位为数值

                    unsigned char     1个字节                             0-255

                    unsigned short    2个字节                             0-65535

                    unsigned int      4个字节                             0-40亿左右

                    unsigned long     4或8个字节(取决于操作系统的位数)    0-40亿左右/0-1开头的20位整数

                    unsigned long long 8个字节                            0-1开头的20位整数

                注意:

                    1、signed不加就代表加了

                    2、由于定义无符号整型时比较麻烦,C标准库把这些类型重定义成一些新的简单的类型名:

                        需要导入头文件<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个字节

                注意:

                    1、小数点后6位有效

                    2、采用一定的算法对真实的浮点型数据到二进制数据进行转换,这个过程比存储、读整型要慢得多,编程时尽量使用整型数据

                double num

                if(num <0.000001 && num >-0.000001)

            模拟型:

                char    字符型      字符就是符号或图案,在内存中存储的依然是整数,需要显示出字符时,会根据ASCLL表中对应的关系显示出对应的字符或图案

                    '0'     48      

                    'A'     65        

                    'a'     97    

                    '\0'    0

                    %hhd    显示ASCLL码的数值

                    %c      显示ASCLL码的图案

                bool    布尔型      1字节   先有的C语言,后有的bool类型,所以C语言中不可能有真正的布尔类型,在头文件stdbool.h中对布尔类型进行了模拟

                    bool    true    false

                    true以%d打印为1     false以%d打印为0


 

八、变量与常量

    什么是变量:程序运行期间数值可以发生改变的叫做变量,相当于一个存储数据的盒子

    定义(格式):  类型名 变量名;

        int num;

        变量名取名规则:

            1、由字母、数字、下划线组成

            2、不能以数字开头

            3、不能与C语言的32个关键字重名,能默写

            4、见名知意(功能、类型、作用范围...)  int sum_s_i

    使用方法:

        赋值:  变量名 = 10;

                num = 10;

        参与运算:  2+(变量名*10);

                2+(num*10);

        注意:C语言中变量的初始值是随机的,为了安全起见,一般在定义时初始化为0

    变量的输出与输入:

        输出:

        int printf(const char *format, ...);

        功能:输出数据

        format:    "双引号包含的提示信息+占位符"

        ...:        变量名列表

        返回值:    输出字符个数

        类型占位符:C语言中通过类型占位符传递变量的类型

            signed  %hhd    %hd     %d      %ld     %lld

            unsigned  %hhu    %hu     %u      %lu     %llu

            float   %f

            double  %lf

            long double %LF

            字符型  char    %c

            练习1:定义各种类型的变量并初始化,使用printf显示他们的值

        输入:

        int scanf(const char *format, ...);

        功能:输入数据

        format:    "双引号包含的占位符"

        ...:        变量地址列表

        返回值:    成功输入的变量的个数

        注意:scanf需提供变量的地址

            &变量名   == 变量地址

        练习2:定义各种类型的变量并初始化为0,使用scanf输入,使用printf显示他们的值

    什么是常量:程序运行期间数值不能改变的叫做常量

        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

        #define SEC 3600*24*365*100u 超范围,+u使其适应范围


 

九、格式化输入输出

    %nd     显示n个字符宽度,不够则补充空格,右对齐

    %-nd    显示n个字符宽度,不够则补充空格,左对齐

    %0nd    显示n个字符宽度,不够则补0,右对齐

    %n.mf   显示n个字符宽度(小数点也算一位),不够则补充空格,m表示小数点后几位(四舍五入,不够补0),右对齐

    %g      不显示小数点后多余的0


 

十、运算符

    自变运算符:++/--   使变量的值自动加1或减1

        前自变:++num/--num 立即生效

        后自变:num++/num-- 下一行语句才生效

        注意:不要在一行代码中多次使用自变运算符

    算数运算符:+ - * / %

        整数/整数   结果还是整数,没有小数点,只保留整数部分    / % 除数不能为0,否则就会浮点数例外、(核心已转储),这是个运行报错,一旦产生程序立即停止,后面不再执行

    关系运算符:> < >= <= == !=

        比较的结果0(不成立)或1(成立),比较结果可以继续参与后续的运算

        int n=-100

        if(10<n<100)    

        结果永远为真,与数学运算规则不同

        注意:==    建议常量放左边

    逻辑运算符: &&与 ||或 !非

        先把运算对象转换成逻辑值,0转换为假,非0转换为真

        A && B  一假即假

        A || B  一真即真

        !A      求反

        注意:&&  ||  具有短路特性:

            当左边部分的值可以确定整个表达式的结果时,右边部分就不执行计算

    三目运算符:运算对象有三个部分

        A?B:C   判断A的值,如果为真执行B,为假执行C

    赋值运算符:

        a=10;

        a+=10;

        a-=10;

        a*=10;

        a/=10;

        a%=10;

    位运算符:   &   |   ~   ^   <<  >>


 

十一、分支语句

    if(表达式)//单分支

    {

        //表达式为真(非0),则执行此处代码

    }



 

    if(表达式)//双分支

    {

       //表达式为真(非0),则执行此处代码

    }

    else

    {

        //表达式为假(0),则执行此处代码

    }



 

    if(表达式1)//多分支

    {

       //表达式为真(非0),则执行此处代码

    }

    else if(表达式2)

    {

        //表达式2为真(非0),则执行此处代码

    }

    else if(表达式3)

    {

        //表达式3为真(非0),则执行此处代码

    }

    else

    {

        //如果以上表达式都为假(0),则最后执行此处代码

    }


 

十二、C语言32个关键字

数据类型相关:

    内建类型:

        char  short  int  long  void  float  double     7

    自建类型:

        struct  union  enum  sizeof                     4

    类型限定符:

        auto  const  static volatile register typedef extern signed unsigned                          9

流程控制相关:

    分支:

        if   else    switch  case  default               5

    循环:

        for  while  do                                  3

    跳转:

        break   continue   goto   return                4

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值