Linux & 标准C语言学习 <DAY4>

一、数据类型
    为什么要对数据进行分类
        1、现实中的数据就是自带类别属性的
        2、对数据进行分类可以节约内存存储空间、提高运行速度
    C语言中数据分为两大类别:自建(程序员自己设计的),内建(C语言自带的)

    存储空间的单位:
        bit 比特 存储一个二进制位,只能存储0或者1,计算机存储数据的最小单位
        Byte 字节 存储八个二进制位,计算机存储数据的基本单位
        KB 1024字节
        MB 1024KB
        GB 1024MB
        TB 1024GB
        PB 1024TB
    sizeof():可以计算类型变量所占内存字节数

    整型:
        signed 有符号 二进制最高位为符号位 0正数 1负数
            类型名              字节数              数据范围
            signed char         1                   -128~127
            signed short        2                   -32768~32767
            signed int          4                   正负20亿
            signed long         4(32位)/8(64位)
            signed long long    8                   正负9开头19位整数
        注意:signed可以不写
        unsigned 无符号 二进制最高位为数据位
            类型名              字节数              数据范围
            unsigned char       1                   0~255
            unsigned short      2                   0~65535
            unsigned int        4                   0~40亿
            unsigned long       4(32位)/8(64位)
            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(32位)/16(64位)      
        注意1:采用科学计数法、在二进制与真实数据之间需要进行换算过程,因此浮点数的运算使用速度比整数型慢得多,所以编程时尽量用整数型
        注意2:大部分操作系统只对小数点后6位有效  

    模拟型:
        字符型:char
            字符就是图案或符号,在内存中本质上依然存储成整数,需要显示成字符时,操作系统会根据ASCII码表中的对应关系把整数显示成对应的符号或图案
            ''      0       特殊字符 空字符
            '0'     48
            'A'     65
            'a'     97
            char想要显示成整数:%hhd
                想要显示成字符:%c

        布尔型:bool
            现有的C语言后有的bool类型,C语言中不可能有真正的布尔类型,都是用<stdbool.h>中使用整数对布尔类型进行模拟
            bool -> true false


二、变量与常量
    变量 -> 在程序运行期间值可以发生变化的叫做变量,相当于存放数据的盒子
    定义:
        类型名 变量名;
            int num;
            取名规则:
                1、由字母、数字、下划线组成
                2、不能以数字开头
                3、不能与C语言32个关键字重名
                4、见名知意(功能、类型、范围...)
        注意:如果一个变量的初始值默认是随机的,一般为了安全,在定义时对变量初始化为0

    使用:
        赋值:      变量名 = val;
        参与运算:  变量名*10;

    变量的输入、输出:
        int printf(const char *format, ...);
        功能:输出数据
        format:"提示信息+占位符"
        ... :变量名列表
        返回值:成功输出的字符个数
        类型占位符:C语言通过占位符的方式传递变量的类型
            %hhu %hu %u %lu %llu unsigned char/short/int/long/long long
            %hhd %hd %d %ld %lld signed char/short/int/long/long long
            %f float
            %lf double
        字符型:%c char

        int scanf(const char *format, ...);
        功能:输入数据
        format:"占位符"
        ...:变量地址列表
            注意:scanf需要变量类型和地址
                变量地址 == &变量名
        返回值:成功输入的变量个数
       
    常量 -> 在程序运行期间值不发生变化
        10      默认 int
        10l     long
        10ll    long long
        10u     unsigned int
        10lu    unsigned long
        10llu   unsigned long long
        3.14    默认 double
        3.14f   float
        3.14l   long double
        问题:定义一个100年总共有几秒的宏定义(忽略闰平年)
            #define SEC 3600*24*365*100u

三、格式化输出
    %nd     显示n个字符宽度,不足时补空格,右对齐
    %-nd    显示n个字符宽度,不足时补空格,左对齐
    %0nd    显示n个字符宽度,不足时补0,右对齐
    %n.md   显示n个字符宽度(小数点也算一位),不足时补空格,右对齐,m表示小数点后显示的位数(四舍五入)
    %g      不显示小数点后多余的0

四、运算符
    自变运算符:
        ++/-- 让变量的值自动加一或减一
        前自变:++/--num    立即有效
        后自变:num++/--    下一行语句才有效
        注意:不要在一行代码中多次出现自变运算符

    算数运算符:
        + - * / %
        整数/整数 只保留整数部分
        / % 除数不能为0,否则会在运行时出现浮点数例外(核心已转储)
        % 不能对浮点数求余

    关系运算符:
        == != > < >= <=
        会得到比较的结果是1(成立)或0(不成立),比较的接果还可以继续参与运算
   
    逻辑运算符:
        && || !
        会先把运算对象转换成逻辑值,非零转为真,0转为假,然后在参与逻辑运算
        A && B  一假即假
        A || B  一真即真
        !A      求反
        &&和||的短路特性:
            当左边部分的值已经确定整个逻辑运算符的结果时,那么右边部分不执行
            也可以借助短路特性,实现简单的单分支效果

    三目运算符:
        A ? B : C
            判断A的值如果为真,则执行B的内容,否则执行C的内容

    赋值运算符:
        = += -= *= ...
        a += b;
        注意:赋值运算符的运算结果是右边赋的数据

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

五、类型转换问题
    只有相同类型的数据才能能进行运算,如果类型不相同的数据需要先转换成相同的类型才能运算
    自动类型转换:
        转换规则:以不丢失数据为基础,可以适当地牺牲一些空间
            1、字节少的向字节多的转
            2、有符号的向无符号的转
            3、整型向浮点型转
            特例:当运算对象类型只是char或者short,编译器会做类型提升,提升为int再运算
    强制类型转换:
        (新类型名)数据;
        有丢失数据的风险,但是需要使用时还是得用


posted @ 2023-03-06 09:23  Phonyeee  阅读(34)  评论(0编辑  收藏  举报