【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会一直从缓冲区中获取,而不要求再次输入。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容