C基础

作者: 晓晓桑 | 来源:发表于2020-04-07 20:05 被阅读0次

    编译工具我用的:CLion,因为inteliji和webstorm用的他家的,所以也选择了他家的CLion。对比上学时候的编译软件,发现很多东西CLion给处理了,使用蛮方便的。
    官网下载(https://www.jetbrains.com/clion/

    一.内建函数

    编译器内部实现的函数。跟关键字一样,可以直接使用,无须像标准库函数那样,要 #include 对应的头文件才能使用。

    C 标准库的内建函数

    内存相关的函数:memcpy 、memset、memcmp
    数学函数:log、cos、abs、exp
    字符串处理函数:strcat、strcmp、strcpy、strlen
    打印函数:printf、scanf、putchar、puts

    二.数据类型

    1.基本数据类型
    • 数值类型
      整型: int、 short、 long、 long long
    • 浮点型:float double
    2.构造类型
    • 数组
    • 结构体
    • 联合体
    • 枚举类型
    3.指针
    4.空类型void

    如果在百16位计算机系统(如Turbo C)中,short类型和int类型都是占2个字节的内存空间,所以其取值范度围都是-215~215-1。
    如果在32位计算机系统(如Visual C++)中,short类型占2个字节,而知int类型占4个字节,因此它道们的取值范围会不一致,此时,short的取值范围为:-215~215-1;而int的取值范围为:-231~231-1

    三.格式化输出符/转义字符

    %d :十进制
    %o:八进制
    %x:十六进制
    \n:换行

    //将十进制12以 十进制、八进制、十六进制显示
      printf("%d\n%o\n%x\n%X\n"", 12, 12, 12);
    

    结果是

    12
    14
     c
     C
    

    http://c.biancheng.net/view/159.html

    四.输出 %d \ ""

    printf("%%d\n");
        printf("\\\n");
        printf("\"\"\n");
    

    结果:

    %d
    \
    ""
    

    五.转义字符

    转义字符 意义 ASCII码值(十进制)
    \a 响铃(BEL) 007
    \b 退格(BS) ,将当前位置移到前一列 008
    \f 换页(FF),将当前位置移到下页开头 012
    \n 换行(LF) ,将当前位置移到下一行开头 010
    \r 回车(CR) ,将当前位置移到本行开头 013
    \t 水平制表(HT) (跳到下一个TAB位置) 009
    \v 垂直制表(VT) 011
    \ 代表一个反斜线字符''' 092
    ' 代表一个单引号(撇号)字符 039
    " 代表一个双引号字符 034
    \0 空字符(NULL) 000
    \ddd 1到3位八进制数所代表的任意字符 三位八进制
    \xhh 1到2位十六进制所代表的任意字符 二位十六进制

    六.int内存大小

    一个int是4字节。
    字节是计算机常用的存储数据。位是计算机最小的存储单位。1字节=8个2进制位。一个2进制位只有0和1。4个字节就是32个2进制位。

    • 获取字节大小:sizeof(类型)sizeof(变量名)
    int a;
     printf("int 数据类型所占字节数:%d\n", sizeof(int)); // 4
    
        printf("char 数据类型所占字节数:%d\n", sizeof(char)); // 1
        printf("short 数据类型所占字节数:%d\n", sizeof(short));// 2
        printf("int 数据类型所占字节数:%d\n" , sizeof(int));  // 4
        printf("long 数据类型所占字节数:%d\n", sizeof(long));// 4
        printf("float 数据类型所占字节数:%d\n", sizeof(float));// 4
        printf("double 数据类型所占字节数:%d\n", sizeof(double));// 8
    

    int表示数的个数:2^32:4294967296个

    • 有符号整型:
    • 取值范围为:-231~231-1 :-2147483648~-2147483647
      -定义:signed int / int
    • 无符号整型:
    • 取值范围为:0~2^32-1: 0~4294967295
      -定义:unsigned int
    int main(void) {
        12;//默认int类型
        int a=2147483649;
    //十进制无符号输出
        printf("%u\n",a); //2147483649
    //十进制有符号输出
        printf("%d\n",a); //-2147483647
        return 0;
    }
    

    short 短整型

    全称:short int
    字节数:2字节
    有符号:signed short 范围:-215~215-1 / -32768~32767
    无符号:unsigned short 范围:0~-2^16-1 / 0~65535
    输出格式符:%hd(有符号)、%hu(无符号)、%ho(八进制) %hx(十六进制)
    注意:只规定int不小于short的长度,也就是说int字节长度>=short的字节长度

    long 长整型

    全称:long int
    字节数:4
    有符号:-231~231-1 :-2147483648~-2147483647
    无符号:0~2^32-1: 0~4294967295
    输出符号:%ld(有符号)、%lu(无符号)、%lo(八进制) %lx(十六进制)
    注意:只规定long不小于int的长度,也就是说long字节长度>=int的字节长度

    long long (vc++ 6.0 不支持这个)

    全称:long long int
    字节数:8
    有符号:-263~263-1
    无符号:0~2^64-1
    输出符号:%lld(有符号)、%llu(无符号)、%llo(八进制) %llx(十六进制)

    变量的地址

    取地址
    • 去地址运算符 :&
    int main(void) {
        int a=12;
        //%p用来输出指针的值、输出地址符。指针,是一个无符号整数/(unsigned int),
        // 它是一个以当前系统寻址范围为取值范围的整数。而%x, %X 输出无符号以[十六进制]表示的整数。
        printf("%p\n",&a);
        printf("%#p\n",&a);
        return 0;
    }
    

    结果

    0x7ffeeac92938
    0x7ffeeac92938
    
    • 取变量地址
      表达式:没有分号,每个表达式都有一个结果。
      语句:有分号
      注:每个变量都有自己唯一的地址。

    七.Scanf

    从键盘修改一个变量的值

    int main(void) {
        int a=15;
        printf("修改前:%d\n",a);
        //注意:输入的时候是a的取地址,%d前面加文字,修改见下面
        scanf("%d",&a);
        printf("修改后:%d\n",a);
        return 0;
    }
    
    

    运行结果


    image.png

    %d前面加文字,修改

    int main(void) {
        int a=15;
        printf("修改前:%d\n",a);
        //注意:输入的时候是a的取地址,%d前面加文字,修改不成功
        scanf("修改:%d",&a);
        printf("修改后:%d\n",a);
        return 0;
    }
    
    

    要把文字一起打进去才行哦


    image.png
    多个输入
    int main(void) {
        int a, b, c, d;
        printf("请输入b c:");
        scanf("%d %d", &b, &c);
        printf("请输入a d:");
        scanf("%d,%d", &a, &d);
        printf("%d-%d-%d-%d", a, b, c, d);
        return 0;
    }
    
    image.png

    注意:转义字符之间啥也没有,每个数输入之间要有空格。scanf里面的转义字符有什么符号,输入的时候就要按他的格式来输入,要不然输入不成功。

    浮点型 :float、double、long double

    float:输出:%f 默认保留小数点后6位
    double:输出:%lf
    long double:输出:%ld

    int main(void) {
        float a = 12.3456789074;
        double b = 13.4;
        printf("a:%f \n b:%lf\n",a,b);
        printf("a:%e \n b:%e\n",a,b);
        return 0;
    }
    

    运行结果
    1.230000e+01 表示1.230000✖️10的正1次方

    a:12.345679 
     b:13.400000
    a:1.234568e+01 
     b:1.340000e+01
    
    区别
    image.png
    • float:
      1.内存大小4字节
      2.表示的范围:正数部分:1.17549e-038~3.40282e+038; 负数部分:-3.40282e+038~-1.17549e-038;0.0:浮点数赋值要赋值0.0,不要赋值0;标准规定:指数范围不小于-37~38
      3.规定精度至少是6位,精度是从数值的第一位开始算。

    • double:
      1.内存大小8字节
      2.表示的范围:正数部分:1.79769e-308~2.22507e+308;负数部分-2.22507e+308~-1.79769e-308;赋值0.0;标准规定:指数范围不小于-37~38
      3.规定精度至少是10位

    • long double:
      1.内存字节不小于double的长度,最少8字节
      2.规定精度至少是10位

    代码获取数值范围

    #include <stdio.h>
    #include <float.h>
    int main(void) {
        printf("float最小值获取%e\n",FLT_MIN);
        printf("float最大值获取%e\n",FLT_MAX);
        printf("double最小值获取%e\n",DBL_MIN);
        printf("double最大值获取%e\n",DBL_MAX);
        printf("long double最小值获取%e\n",LDBL_MIN);
        printf("long double最大值获取%e\n",LDBL_MAX);
        return 0;
    }
    
    

    运行结果:

    float最小值获取1.175494e-38
    float最大值获取3.402823e+38
    double最小值获取2.225074e-308
    double最大值获取1.797693e+308
    long double最小值获取1.797693e+308
    long double最大值获取1.797693e+308
    

    精度测试,double为例

    int main(void) {
        double d = 233.456809642313457859421234;
        printf("%lf\n", d); //默认打印小数点后6位,第六位四舍五入。其他俩个也一样。
        printf("%.20lf\n", d); //打印小数点后20位
        printf("%.30lf\n", d); //打印小数点后20位
        return 0;
    }
    
    233.456810
    233.45680964231345910775
    233.456809642313459107754169963300
    

    浮点型后缀

    image.png
    image.png

    系统计算,只对同类型的计算,不同类型的会转化成同类型之后再计算,后续会讲。

    浮点型输出

    %10.3f表示:一共输出10个字符,保留小数点后3位。如果不够10个字符,就会在数值前面加空格来补充。
    %-10.3 负号表示左对齐,正好是右对齐。

    int main(void) {
        float f = 293.4356f;
        printf("%f\n", f);
        printf("%.3f\n", f);
        printf("%10.3f\n", f);
        printf("%20.3f\n", f);
        printf("%-20.3f\n", f); //-
        return 0;
    }
    
    image.png

    浮点型的内存存储

    • int存储结构


      image.png
    • float数据存储结构
      image.png
      最高符号位:1代表负数,0代表正数。
      指数位:-27~27-1:-127~128
      有效位数(尾数位):2^23 :8388608(7位)
    • double数据存储结构
      最高符号位:1代表负数,0代表正数。
      指数位:-210~210-1:-1024~1023
      有效位数(尾数位):2^52 :4503599627370496(16位)

    相关文章

      网友评论

          本文标题:C基础

          本文链接:https://www.haomeiwen.com/subject/tnhophtx.html