初学者的笔记-----标准C语言day01

一、C语言简介

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

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

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

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

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

        自由源于自律

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

        C99语法标准,是对C语言的扩展和增强  

                Ubuntu 16.04    默认C99    

                -std=gnu99  指定为C99语法标准

        C11语法标准,是全新的升级

二、第一个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>

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

                    #include "xxx.h"

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

            stdio.h

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


       

int main()
{
    printf("Hello World!\n");
    return 0;
}

        main函数:

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

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

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

                return  功能有两个:1、结束函数的执行

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

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

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

                        0         一切正常

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

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

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

                转义字符:

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

                        \r      回到行首

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

                        \b     退格键(只是光标退一格,不是删除)       打印退格效果 \b空格\b

                        \a      铃响

                        \\      表示一个\

                        %%   表示一个%

C语言中以分号;作为一行代码的结束,使用大括号{}划分区域

三、编译器

        负责把人能看得懂的记录着代码的文件,翻译成计算机能看得懂的二进制文件,由预处理器、编译器、链接器组成

        gcc是由GNU社区为了编译Linux内核代码而开发的一款免费的编译器

        gcc常用的编译参数:

                -E      只显示预处理的结果到终端

                -std=gnu99      设置C99语法标准

                -c      只编译不链接

                -o      指定编译结果的名字 -oname -o name

                -S      只生成汇编代码

                -I      指定头文件的加载路径    -I 加载路径/path

                -Wall   尽可能多地产生警告

                -Werror 把警告当错误处理

                -l      指定要加载的代码库      -lm     使用数学库math.h

四、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  有符号的整数    最高位为符号 0为正 1为负

                                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不加就代表了加(不加signed即有符号)

                                  由于定义无符号整型时比较麻烦,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字节

                        注意:小数点后六位有效

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

                double

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

                num = 0;

                模拟型:

                        字符型:char

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

                                '\0'    0       特殊字符

                                '0'     48

                                'A'     65

                                'a'     97

                        布尔型:bool

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

                                        bool    true    false

八、变量和常量

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

        定义:  类型名 变量名;

                    int num;

                    取名规则:

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

                        2、不能以数字开头

                        3、不能与C语言32个关键字重名

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

                        int sum_s_i     可用codelf起名

        使用:

                赋值:  变量名 = 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

                        练习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

                         

                         问题:100年有多少秒(忽略闰年)

                                 超出 signed int 范围,使用 unsigned int

                                #define SEC 3600*24*365*100u

九、格式化输入输出

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

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

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

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

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

十、运算符

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

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

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

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

        算术运算符:+ - * / %  

                整数/整数       结果还是整数,没有小数点,只保留整数部分

                        10/3    ->      3

                        10%3   ->      1

                / %     除数不能为0,否则就会浮点数例外、(核心已转储),这是个运行报错,一旦产生程序立即停止,后面不再执行

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

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

                int n = -100;

                if(10 < n < 100)        结果永远为真,与数学运算规则不同

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

        逻辑运算符:&&  ||  !  

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

                A && B  一假即假

                A || B      一真即真

                !A           求反

                && ||     短路特性:

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

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

                A ? B : C       判断A的值如果为真(非0)则执行B,否则执行C

        赋值运算符:

                a = 10;

                a += 10;        a = a + 10;

                a -= 10;

                a *= 10;

                a /= 10;

                a %= 10;

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

十一、分支语句

        if(表达式)      //单分支

        {

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

        }

        if(表达式)      //双分支

        {

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

        }

        else

        {

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

        }

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

        {

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

        }

        else if(表达式2)

        {

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

        }

        else if(表达式3)

        {

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

        }

        ...

        else    //可不加else

        {

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

        }

        1、输入三个整数,从小到大显示

        2、输入一个年份,判断是否是闰年?

                四闰百不闰,四百闰

        3、输入一个年份和月份,判断该月有多少天?

        4、输入一个成绩,判断等级

                【90,100】     A

                【80,89】       B

                【70,79】       C

                【60,69】       D

                【0,59】         E

                    other            成绩有误

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值