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

概述

今天重大是常量变量,printf,scanf等情节。

1.变量内存分析

  • 外存以“字节为单位”。
  • 内存由死至稍微寻址。
  • int a, int b
    的逐条来声称变量,则内存中a的地址以底下(即先申请,因为内存由坏到小寻址),b的地址以a上面;int
    b, int a 则是b先申请以内存的下面。
  • 类似Excel表格的变量在内存中的囤积形式。每一个约表示一个字节(内存的单位)。
    以int类型为条例,四羁绊为一个int类型的变量,从下为上排(内存由好至稍微寻址),内存地址为16进制的勤,比如从大至多少也0xff218,0xff217,0xff216,0xff215也一个整形变量所占据内存,0xff215啊该变量的地点(指针)。下一个变量则挨着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格式符输出时,仅前7各项是行得通数字,小数6各。对于对精度往往,使用%lf格式符输出时,前15员是行数字,小数6号。

  • 只要输出float,%.2f这种样式,如果是3.148,则结果也3.15,自动四放弃五合乎。

  • 假如手上屡次是3.14,输出的时刻要求%5.5f,既求满足一共5各,又要求小数点后呢要是起5员,无法以满足,则输出结果是3.14000,优先满足小数各类。

  • 当%后面加上.m表示想只要保存多少个小数,这个不同为面提到的,如果无小数点那么当操作数位数大于m的下会突破限制保留当前底位数,但是因为%.m这种样式保留小数则是直保存想如果稍位之勤。若当前操作数小于m,则以末端补空格。自家理解:整数允许突破限制是纪念只要包精度与科学,小数则可以忽略不思要的有的,因为可能对精度之熏陶多少。

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

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

    由此%m方式, 指定输出数值宽度(左端补空格)

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

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

    其一例子,想只要出口9列浮点数,但是浮点数最充分七个,既3141593,算上.只出8位,要满足9列则在左加上空格。

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

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

  • 要求输出3.1415926535f具小数

    品通过点名保留位数

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

    出口结果: 3.1415927410

    输出结果: 314159.2500000000

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

    尝指定宽度

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

    出口结果:

      $$$$3.141593
    

    品指定宽度与保存位数

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

    输出结果: 3.1415927410

倘惦记完全输出必须采取double,因为double类型精度小数点后6位,有效数字是15号

    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会一直由缓冲区中拿走,而未求重复输入。