【C语言】2.变量内存以及printf & scanf的坑

概述

前几天重中之重是常量变量,printf,scanf等情节。

1.变量内存分析

  • 内存以“字节为单位”。
  • 内存由大到小寻址。
  • int a, int b
    的逐一来声称变量,则内存中a的地址在底下(即先申请,因为内存由大到小寻址),b的位置在a上面;int
    b, int a 则是b先申请在内存的上边。
  • 类似Excel表格的变量在内存中的存储格局。每1个格表示五个字节(内存的单位)。
    以int类型为例,四格为一个int类型的变量,从下往上排列(内存由大到小寻址),内存地址为16进制的数,比如从大到小为0xff218,0xff217,0xff216,0xff215为八个整形变量所占内存,0xff215为该变量的地点(指针)。下2个变量则挨着0xff215继续上扬三个,以此类推。

类型  16位编译器  32位编译器  64位编译器
char        1           1           1
int      2          4           4
float      4            4           4
double    8         8           8
short      2            2           2
long        4           4           8
long long   8           8           8
void*      2            4            8


关键字                 所占字节数   表示范围
int                         4   -2(31) ~ 2(31)-1
signed short int               2    -2(15) ~ 2(15)-1
signed long int             4   -2(31) ~ 2(31)-1
unsigned int                   4    0 ~ 2(32)-1
unsigned short int           2  0 ~ 2(16)-1
unsigned long int             4 0 ~ 2(32)-1
float                         4 绝对值E-37 ~ E+38
double                       8  绝对值E-307 ~ E+308

2. printf(位宽和控制实型位数的难点)

  • 格式化字符串时,%ms或者%md%mi那种格式,m为壹个平头,表示想要一共保留多少位。如%5d则表示留5列(位)。(位宽)

  • 借使当前的操作数超出想要保留的位数,则突破m的限定,保留本身的位数。如若当前的操作数小于想要保留的位数,则暗许在左手补充空格。

  • 如果为%-md那种格局,则象征在现阶段操作数小于m的符合变成在右边补充空格。

  • 在输出实型的时候,对于单精度数,使用%f格式符输出时,仅前8人是卓有成效数字,小数7人。对于双精度数,使用%lf格式符输出时,前17个人是实用数字,小数七位。

  • 设若输出float,%.2f那种样式,假设是3.148,则结果为3.15,自动四舍五入。

  • 假若当前数是3.14,输出的时候需要%5.5f,既须要满足一共几个人,又须求小数点后也要有7人,不可以同时满足,则输出结果是3.14000,优先满足小数位。

  • 在%前边加上.m表示想要保留多少位小数,这一个不一致于上边提到的,如若没有小数点那么当操作数位数大于m的时候会突破限制保留当前的位数,然而以%.m这种样式保留小数则是一向保存想要多少位的数。若当前操作数小于m,则在后头补空格。本人领悟:整数允许突破限制是想要保障精度和不易,小数则足以忽略不想要的有的,因为大概对精度的熏陶小。

  • %08d表示保留8列,不足用0来补充。

    printf(“%.2f”, 3.1415926535f); 输出结果: 3.14

    经过%m格局, 钦点输出数值宽度(左端补空格)

    printf(“%9f”, 3.1415926535f);

    出口结果: $3.141593 注意$代表空格

    其一例子,想要输出9列浮点数,可是浮点数最大八个人,既3141593,算上.只有7位,要满足9列则在左边加上空格。

  • 内定保留多少位小数时, 可以通过*号占位, 以后赋值具体保留的小数位

    printf(“%.*f”, 4,3.1415926535f); 输出结果: 3.1416

  • 需求输出3.1415926535f富有小数

    尝试通过点名保留位数

      printf("%.10f", 3.1415926535f);
      printf("%.10f", 314159.26535f);
    

    出口结果: 3.1415927410

    出口结果: 314159.2陆仟00000

      float有效数字是7位, 多余位数则会显示垃圾数据(不准确)
    

    品尝内定宽度

      printf("%12f", 3.1415926535f);
    

    出口结果:

      $$$$3.141593
    

    品尝钦赐宽度和封存位数

      printf("%12.10f", 3.1415926535f);
    

    出口结果: 3.1415927410

要想完全输出必须接纳double,因为double类型精度小数点后六位,有效数字是1七位

    double doubleValue = 3.1415926535; // 注意后面没有f
    printf("%.10lf", doubleValue);
    输出结果:3.1415926535

3. scanf的坑

  • 除”空格”,”回车”,”tab”之外,
    倘若输入的多少和scanf接收的多少不合营将会自行终止接收。
  • 万一在输入时,输入了多少个空格、回车、Tab都会被系统忽略的。
  • 假若要得到的始末是多个整数,中间输入了两个空格、回车、Tab都会被系统忽略。
  • 假设要收获的情节是三个实型,中间输入了多少个空格、回车、Tab都会被系统忽略。
  • 当整形的数和字符混合输入时,要防止“空格” 添麻烦。
  • 为防患混合输入空格造成的失实,可以透过添加普通的相间符化解。如”,”。
  • scanf函数当境遇回车的时候,会终结执行。
  • 从而在scanf中,尽量不要采用 \n。即使在scanf中使用了\n,
    必要原样输入”\n”。

4. scanf函数已毕原理

  • 系统会将用户输入的内容了放入输入缓冲区
  • scanf格局会从输入缓冲区中逐个取出内容赋值给格式符,如若类型不等同不会修改原有数据。
  • 假若输入缓冲区的情节不为空,scanf会一贯从缓冲区中取得,而不需要再一次输入。