提示文章写完后目录可以自动生成如何生成可参考右边的帮助文档文章目录前言1.数据类型介绍1.1 字符型1.2 整型1.3 浮点型1.4 布尔类型1.5 各种数据类型的⻓度1.5.1 sizeof操作符2. signed和unsigned3. 数据类型的取值范围4. 变量4.1 变量的创建4.2 变量的分类5. 算术操作符、-、*、/、%5.1 和-5.2 *5.3 /5.4 %6. 赋值操作符和复合赋值6.1 连续赋值6.2 复合赋值符7. 单⽬操作符、--、、-7.1 和--7.1.1前置7.1.2 后置7.1.3 前置- -7.1.4 后置- -7.2 和 -8. 强制类型转换9. printf 和 scanf 介绍9.1 printf9.1.1 基本⽤法9.1.2 占位符9.1.3 占位符列举9.1.4 输出格式9.1.4.1 限定宽度9.1.4.2 总是显⽰正负号9.1.4.3 限定小数位数9.1.4.4 输出部分字符串9.2 scanf9.2.1 基本⽤法9.2.2 scanf的返回值9.2.3 占位符9.2.4 赋值忽略符目录数据类型介绍signed和unsigned数据类型的取值范围变量算术操作符、-、*、/、%赋值操作符和复合赋值单⽬操作符、–、、-强制类型转换scanf和printf介绍前言上一讲我们初步认识了C语言程序这一讲是C语言编程最地基的内容。不管是写循环、写函数、做项目代码里时时刻刻都离不开数据、变量、运算符。对于那些对C语言有了解的同学来说这部分会很简单但对于完全对这个领域没了解的同学来说这部分或许太抽象了但不要着急我们可以借助AI来辅助学习一定要学会借用A来学习但在基础阶段不要用AI帮你写代码这样很容易造成一学就会一写就费的局面。一定要坚持下来千万不要从入门到放弃这部分内容对于计算机学生来说是不是感觉很熟悉好像又看到了曾经让人头疼的天书以下说到的这几本书与C语言并没有直接的关系但可以帮助我们更好的理解这门语言个人认为如果是计算机专业的学生应该学一下这4本书当然这几本都是大部分计算机专业必修的也是计算机专业408考研的专业课《计算机组成原理》《数据结构》《操作系统》《计算机网络》后续我也会接着出这几本书的相关内容1.数据类型介绍C语言里世间所有数据都被划分成了固定的类别也就是数据类型。作用非常简单告诉编译器这块内存要开多大空间、数据怎么存储、能参与什么运算。下⾯盘点⼀下C语⾔提供的各种数据类型本章节主要探讨内置数据类型。内置类型就是C语言本身就有的自定义类型需要我们自己设计1.1到1.5这里可以简单过一下等看完下面的2和3就很容易看懂了1.1 字符型字符的英⽂单词是 character 在C语⾔中使⽤ char 表⽰字符类型。【注】[ ]里的内容表示的是可以省略的意思char//character[signed]char//有符号的unsignedchar//⽆符号的1.2 整型整数的英⽂单词是 integer 在C语⾔中使⽤ int 表⽰整型类型。//整数 - integer//短整型short[int][signed]short[int]//有符号短整型unsignedshort[int]//无符号短整型//整型int[signed]intunsignedint//⻓整型long[int][signed]long[int]unsignedlong[int]//更⻓的整型//C99中引⼊longlong[int][signed]longlong[int]unsignedlonglong[int]1.3 浮点型floatdoublelongdouble浮点型为什么没有 signed / unsigned浮点数的存储格式决定的float、double 在内存里是按「符号位 指数位 尾数位」固定存储的天生自带一位符号位天生就能表示正数、负数、0。标准规定C语言标准明确规定signed 、 unsigned 只能用于整数类型, 不能用来修饰 float 、 double【注】:这里想要了解1是什么意思需要结合《计算机组成原理》这本书1.4 布尔类型C语⾔原来并没有为布尔值单独设置⼀个类型⽽是使⽤整数 0 表⽰假⾮零值表⽰真。在 C99 中也引⼊了 布尔类型 是专⻔表⽰真假的。_Bool1布尔类型的使⽤得包含头⽂件 stdbool.h布尔类型变量的取值是 true 或者 false#definebool_Bool#definefalse0#definetrue1代码演⽰_Boolflagtrue;if(flag)printf(i like C\n);为了方便常常将_Bool写成bool也是可以的1.5 各种数据类型的⻓度每⼀种数据类型都有⾃⼰的⻓度使⽤不同的数据类型能够创建出⻓度不同的变量变量⻓度的不同存储的数据范围就有所差异。1.5.1 sizeof操作符1.sizeof 是⼀个关键字也是操作符专⻔是⽤来计算 sizeof 的操作数的类型⻓度的单位是字节。sizeof 操作符的操作数可以是类型也可是变量或者表达式。sizeof(类型)sizeof表达式2.sizeof 的操作数如果不是类型是表达式的时候可以省略掉后边的括号的。3.sizeof 后边的表达式是不真实参与运算的根据表达式的类型来得出⼤⼩。4.sizeof 的计算结果是 size_t 类型的如果要打印在屏幕上可以使⽤%zu的占位符。【注2】【注3】sizeof 在代码进⾏编译的时候就根据表达式的结果的类型推到并确定了类型的⻓度⽽表达式真要被执⾏却要在程序运⾏期间才会发⽣如果在编译期间已经将 sizeof 处理掉了所以在运⾏期间就不会执⾏表达式了。【注4】sizeof 运算符的返回值C语⾔只规定是⽆符号整数并没有规定具体的类型⽽是留给系统⾃⼰去决定 sizeof 到底返回什么类型。不同的系统中返回值的类型有可能是 unsigned int 也有可能是 unsigned long 甚⾄是 unsigned long long 对应的 printf() 占位符分别是 %u 、 %lu 和 %llu 。这样不利于程序的可移植性。C语⾔提供了⼀个解决⽅法创造了⼀个类型别名 size_t ⽤来统⼀表⽰ sizeof 的返回值类型。C语言规定sizeof(long)大于等于sizeof(int),sizeof(long double)大于等于sizeof(double)因此long与long double的取值与操作系统编译器的位数有关参考资料数据类型⻓度和取值范围-官⽅介绍2. signed和unsignedC语⾔使⽤ signed 和 unsigned 关键字修饰字符型和整型类型的。signed 关键字表⽰⼀个类型带有正负号包含负值unsigned 关键字表⽰该类型不带有正负号只能表⽰零和正整数。1.对于 int 类型默认是带有正负号的也就是说 int 等同于 signed int 。由于这是默认情况关键字 signed ⼀般都省略不写但是写了也不算错。signedinta;// 等同于int a;int 类型也可以不带正负号只表⽰⾮负整数。这时就必须使⽤关键字 unsigned 声明变量。unsignedinta;整数变量声明为 unsigned 的好处是同样⻓度的内存能够表⽰的最⼤整数值增⼤了⼀倍。⽐如16位的 signed short int 的取值范围是-32768~32767最⼤是32767⽽unsigned short int 的取值范围是0~65535最⼤值增⼤到了65535。32位的 signed int的取值范围可以参看 limits.h 中给出的定义。unsigned int ⾥⾯的 int 可以省略所以上⾯的变量声明也可以写成下⾯这样。unsigneda;2.字符类型 char 也可以设置 signed 和 unsigned 。signedcharc;// 范围为 -128 到 127unsignedcharc;// 范围为 0 到 255注意!!!C语⾔规定 char 类型默认是否带有正负号由当前系统决定。这就是说 char 不等同于 signed char 它有可能是 signed char 也有可能是unsigned char 。这⼀点与 int 不同 int 就是等同于 signed int 。3. 数据类型的取值范围上述的数据类型很多尤其数整型类型就有short、int、long、longlong四种为什么呢其实每⼀种数据类型有⾃⼰的取值范围也就是存储的数值的最⼤值和最⼩值的区间有了丰富的类型我们就可以在适当的场景下去选择适合的类型。如果要查看当前系统上不同数据类型的极限值limits.h ⽂件中说明了整型类型的取值范围。float.h 这个头⽂件中说明浮点型类型的取值范围。下面是整理出的最常用表格这部分也会在《计算机组成原理》中介绍想先了解的可以借助AI4. 变量4.1 变量的创建了解清楚了类型我们使⽤类型做什么呢类型是⽤来创建变量的。什么是变量呢C语⾔中把经常变化的值称为变量不变的值称为常量。变量创建的语法形式是这样的变量命名的⼀般规则• 只能由字⺟包括⼤写和⼩写、数字和下划线_组成。• 不能以数字开头。• ⻓度不能超过63个字符。• 变量名中区分⼤⼩写的。• 变量名不能使⽤关键字。• 最好做到见名知意比如我要定义一个人的年龄就用age表示年龄intage;//整型变量charch;//字符变量doubleweight;//浮点型变量变量在创建的时候就给⼀个初始值就叫初始化。intage18;charchw;doubleweight48.0;unsignedintheight100;4.2 变量的分类全局变量在⼤括号外部定义的变量就是全局变量,全局变量的使⽤范围更⼴整个⼯程中想使⽤都是有办法使⽤的.局部变量在⼤括号内部定义的变量就是局部变量局部变量的使⽤范围是⽐较局限只能在⾃⼰所在的局部范围内使⽤的。代码块#includestdio.hintglobal2023;//全局变量intmain(){intlocal2018;//局部变量printf(%d\n,local);printf(%d\n,global);return0;}如果局部和全局变量名字相同呢#includestdio.hintn1000;intmain(){intn10;printf(%d\n,n);//打印的结果是多少呢return0;//结果是10}其实当局部变量和全局变量同名的时候局部变量优先使⽤。全局变量和局部变量在内存中存储在哪⾥呢【变量创建的本质实在内存开辟空间】⼀般我们在学习C/C语⾔的时候我们会关注内存中的三个区域栈区、堆区、静态区。个人认为要想学好计算机深刻了解一门语言这部分是很重要的这部分内容在《计算机组成原理》《数据结构》《操作系统》都有涉及局部变量是放在内存的栈区全局变量是放在内存的静态区堆区是⽤来动态内存管理的后期会介绍其实内存区域的划分会更加细致计算机专业的同学在学习《操作系统》的相关知识的时候会有更深的了解。5. 算术操作符、-、*、/、%在写代码时候⼀定会涉及到计算。C语⾔中为了⽅便运算提供了⼀系列操作符其中有⼀组操作符叫算术操作符。分别是 - */ % 这些操作符都是双⽬操作符。注操作符也被叫做运算符是不同的翻译意思是⼀样的。5.1 和-和 - ⽤来完成加法和减法。和 - 都是有2个操作数的位于操作符两端的就是它们的操作数这种操作符也叫双⽬操作符。5.2 *运算符 * ⽤来完成乘法。5.3 /运算符 / ⽤来完成除法。除号的两端如果是整数执⾏的是整数除法得到的结果也是整数。上面的例子中 a / 4 结果为2是因为C语⾔⾥⾯的整数除法是整除只会返回整数部分丢弃⼩数部分。上⾯⽰例中 10 / 4.0 表⽰进⾏浮点数除法得到的结果就是 2.500000 。5.4 %运算符 % 表⽰求模(余)运算即返回两个整数相除的余值。这个运算符只能⽤于整数不能⽤于浮点数。负数求模的规则是结果的正负号由第⼀个运算数的正负号决定。上⾯⽰例中第⼀个运算数的正负号 11 或 -11 决定了结果的正负号。%-- 可以用来计算一个整数的最后一位6. 赋值操作符和复合赋值在变量创建的时候给⼀个初始值叫初始化在变量创建好后再给⼀个值这叫赋值。inta100;//初始化a200;//赋值这⾥使⽤的就是赋值操作符赋值操作符 是⼀个随时可以给变量赋值的操作符。6.1 连续赋值赋值操作符也可以连续赋值如:C语⾔虽然⽀持这种连续赋值但是写出的代码不容易理解建议还是拆开来写这样⽅便观察代码的执⾏细节。6.2 复合赋值符在写代码时我们经常可能对⼀个数进⾏⾃增、⾃减的操作如下代码这样的代码C语⾔给提供了更加⽅便的写法C语⾔中提供了复合赋值符⽅便我们编写代码这些赋值符有7. 单⽬操作符、–、、-前⾯介绍的操作符都是双⽬操作符有2个操作数的。C语⾔中还有⼀些操作符只有⼀个操作数被称为单⽬操作符。 、–、(正)、-(负) 就是单⽬操作符的。7.1 和–是⼀种⾃增的操作符⼜分为前置和后置–是⼀种⾃减的操作符也分为前置–和后置–.7.1.1前置算⼝诀先1后使⽤a原来是10先1后a变成了11再使⽤就是赋值给bb得到的也是117.1.2 后置intmain(){inta10;intba;//后置: 先使用再1.等价于b a, a a1;printf(a %d\n,a);//11printf(b %d\n,b);//10return0;}计算⼝诀先使⽤后1a原来是10先使⽤就是先赋值给bb得到了10然后再1然后a变成了11所以直接结束后a是11b是10这部分要亲手敲一遍代码哦7.1.3 前置- -如果你看懂了前置那前置–是同理的只是把加1换成了减1计算⼝诀先-1后使⽤intmain(){inta10;intb--a;//前置--: 先-1再使用printf(a %d\n,a);//9printf(b %d\n,b);//9return0;}7.1.4 后置- -同理后置–类似于后置只是把加⼀换成了减⼀计算⼝诀先使⽤后-1inta10;intba--;//--的操作数是a是放在a的后⾯的就是后置--printf(a%d b%d\n,a,b);//输出的结果是9 107.2 和 -这⾥的是正号-是负号都是单⽬操作符。运算符 对正负值没有影响是⼀个完全可以省略的运算符但是写了也不会报错inta10;//等价于 int a 10;intb-a;intc-10;printf(b%d c%d\n,b,c);//这⾥的b和c都是-10inta-10;intb-a;printf(b%d\n,b);//这⾥的b是108. 强制类型转换在操作符中还有⼀种特殊的操作符是强制类型转换语法形式很简单形式如下请看代码inta3.14;//a的是int类型, 3.14是double类型两边的类型不⼀致编译器会报警告为了消除这个警告我们可以使⽤强制类型转换inta(int)3.14;//意思是将3.14强制类型转换为int类型这种强制类型转换只取整数部分俗话说强扭的⽠不甜我们使⽤强制类型转换都是万不得已的时候使⽤如果不需要强制类型转化就能实现代码这样⾃然更好的。9. printf 和 scanf 介绍9.1 printf9.1.1 基本⽤法printf() 的作⽤是将参数⽂本输出到屏幕。它名字⾥⾯的 f 代表 format 格式化表⽰可以定制输出⽂本的格式。intmain(){printf(Hello World);return0;}上⾯命令会在屏幕上输出⼀⾏⽂字“Hello World”。printf() 不会在⾏尾⾃动添加换⾏符运⾏结束后光标就停留在输出结束的地⽅不会⾃动换⾏。为了让光标移到下⼀⾏的开头可以在输出⽂本的结尾添加⼀个换⾏符 \n 。intmain(){printf(Hello World\n);return0;}printf() 是在标准库的头⽂件 stdio.h 定义的。使⽤这个函数之前必须在源码⽂件头部引⼊这个头⽂件9.1.2 占位符printf() 可以在输出⽂本中指定占位符。所谓“占位符”就是这个位置可以⽤其他值代⼊。上⾯⽰例中 There are %d apples\n 是输出⽂本⾥⾯的 %d 就是占位符表⽰这个位置要⽤其他值来替换。占位符的第⼀个字符⼀律为百分号 % 第⼆个字符表⽰占位符的类型 %d 表⽰这⾥代⼊的值必须是⼀个整数。printf() 的第⼆个参数就是替换占位符的值上⾯的例⼦是整数 10 替换 %d 。执⾏后的输出结果就是 There are 10 apples 。上⾯⽰例中 %s 表⽰代⼊的是⼀个字符串所以 printf() 的第⼆个参数就必须是字符串这个例⼦是 zhangsan 。执⾏后的输出就是 zhangsan will come tonight 。输出⽂本⾥⾯可以使⽤多个占位符。上⾯⽰例中输出⽂本 %s says it is %d o’clock 有两个占位符第⼀个是字符串占位符 %s 第⼆个是整数占位符 %d9.1.3 占位符列举这些都不用背的只在用的时候知道就行其实C语言的学习基本都不用背只要你经常写代码自然而然就会熟悉printf() 的占位符有许多种类与C语⾔的数据类型相对应。下⾯按照字⺟顺序列出常⽤的占位符⽅便查找具体含义在后⾯章节介绍。• %a ⼗六进制浮点数字⺟输出为⼩写。• %A ⼗六进制浮点数字⺟输出为⼤写。• %c 字符。//char• %d ⼗进制整数有符号的10进制整数。• %e 使⽤科学计数法的浮点数指数部分的 e 为⼩写。• %E 使⽤科学计数法的浮点数指数部分的 E 为⼤写。• %i 整数基本等同于 %d 。• %f ⼩数包含 float 类型和 double 类型。//float%fdouble%lf• %g 6个有效数字的浮点数。整数部分⼀旦超过6位就会⾃动转为科学计数法指数部分的 e为⼩写。• %G 等同于 %g 唯⼀的区别是指数部分的 E 为⼤写。• %hd ⼗进制 short int 类型。• %ho ⼋进制 short int 类型。• %hx ⼗六进制 short int 类型。• %hu unsigned short int 类型。• %ld ⼗进制 long int 类型。• %lo ⼋进制 long int 类型。• %lx ⼗六进制 long int类型。• %lu unsigned long int 类型。• %lld ⼗进制 long long int 类型。• %llo ⼋进制 long long int 类型。• %llx ⼗六进制 long longint类型。• %llu unsigned long long int 类型。• %Le 科学计数法表⽰的 long double 类型浮点数。• %Lf long double 类型浮点数。• %n 已输出的字符串数量。该占位符本⾝不输出只将值存储在指定变量之中。• %o ⼋进制整数。• %p 指针⽤来打印地址。• %s 字符串。• %u ⽆符号整数unsigned int。• %x ⼗六进制整数。• %zu size_t 类型。• %% 输出⼀个百分号。9.1.4 输出格式printf() 可以定制占位符的输出格式。9.1.4.1 限定宽度printf() 允许限定占位符的最⼩宽度。上⾯⽰例中 %5d 表⽰这个占位符的宽度⾄少为5位。如果不满5位对应的值的前⾯会添加空格。输出的值默认是右对⻬即输出内容前⾯会有空格如果希望改成左对⻬在输出内容后⾯添加空格可以在占位符的 % 的后⾯插⼊⼀个 - 号。上⾯⽰例中输出内容 123 的后⾯添加了空格。对于⼩数这个限定符会限制所有数字的最⼩显⽰宽度。上⾯⽰例中 %12f 表⽰输出的浮点数最少要占据12位。由于⼩数的默认显⽰精度是⼩数点后6位所以 123.45 输出结果的头部会添加2个空格。9.1.4.2 总是显⽰正负号默认情况下 printf() 不对正数显⽰ 号只对负数显⽰ - 号。如果想让正数也输出 号可以在占位符的 % 后⾯加⼀个 。上⾯⽰例中 %d 可以确保输出的数值总是带有正负号。9.1.4.3 限定小数位数出⼩数时有时希望限定⼩数的位数。举例来说希望⼩数点后⾯只保留两位占位符可以写成 %.2f 。如果希望⼩数点后⾯输出3位 1.237 占位符就要写成 %.3f这种写法可以与限定宽度占位符结合使⽤。上⾯⽰例中 %6.2f 表⽰输出字符串最⼩宽度为6⼩数位数为2。所以输出字符串的头部有两个空格。最⼩宽度和⼩数位数这两个限定值都可以⽤ * 代替通过 printf() 的参数传⼊。上⾯⽰例中 %*.*f 的两个星号通过 printf() 的两个参数 6 和 2 传⼊。9.1.4.4 输出部分字符串%s 占位符⽤来输出字符串默认是全部输出。如果只想输出开头的部分可以⽤ %.[m]s 指定输出的⻓度其中 [m] 代表⼀个数字表⽰所要输出的⻓度。9.2 scanf当我们有了变量我们需要给变量输⼊值就可以使⽤ scanf 函数如果需要将变量的值输出在屏幕上的时候可以使⽤ prinf 函数下⾯看⼀个例⼦intmain(){intscore0;scanf(%d,score);// -- 取地址操作符取出scode的地址printf(%d\n,score);return0;}运行展示画图演示注标准输⼊⼀般指的就是键盘标准输出⼀般指的就是屏幕VS报错提示如果出现这样的报错#define_CRT_SECURE_NO_WARNINGS9.2.1 基本⽤法scanf() 函数⽤于读取⽤⼾的键盘输⼊。程序运⾏到这个语句时会停下来等待⽤⼾从键盘输⼊。⽤户输⼊数据、按下回⻋键后 scanf() 就会处理⽤⼾的输⼊将其存⼊变量。它的原型定义在头⽂件 stdio.h 。scanf() 的语法跟 printf() 类似。inti0;scanf(%d,i);它的第⼀个参数是⼀个格式字符串⾥⾯会放置占位符与 printf() 的占位符基本⼀致告诉编译器如何解读⽤⼾的输⼊需要提取的数据是什么类型。这是因为C语⾔的数据都是有类型的 scanf() 必须提前知道⽤⼾输⼊的数据类型才能处理数据。它的其余参数就是存放⽤⼾输⼊的变量格式字符串⾥⾯有多少个占位符就有多少个变量。上⾯⽰例中 scanf() 的第⼀个参数 %d 表⽰⽤⼾输⼊的应该是⼀个整数。 %d 就是⼀个占位符 % 是占位符的标志 d 表⽰整数。第⼆个参数 i 表⽰将⽤⼾从键盘输⼊的整数存⼊变量i 。注意变量前⾯必须加上 运算符指针变量除外因为 scanf() 传递的不是值⽽是地址即将变量 i 的地址指向⽤⼾输⼊的值。如果这⾥的变量是指针变量⽐如字符串变量那就不⽤加 运算符。下⾯是⼀次将键盘输⼊读⼊多个变量的例⼦。scanf(%d%d%f%f,i,j,x,y);输出展示上⾯⽰例中格式字符串 %d%d%f%f 表⽰⽤⼾输⼊的前两个是整数后两个是浮点数⽐如1 -20 3.4 -4.66 。这四个值依次放⼊ i 、 j 、 x 、 y 四个变量。scanf() 处理数值占位符时会⾃动过滤空⽩字符包括空格、制表符、换⾏符等。所以用户输⼊的数据之间有⼀个或多个空格不影响 scanf() 解读数据。另外⽤户使⽤回⻋键将输⼊分成⼏⾏也不影响解读。比如所以scanf() 处理用户输入的原理是什么呢scanf() 处理⽤⼾输⼊的原理是⽤⼾的输⼊先放⼊缓存等到按下回⻋键后按照占位符对缓存进⾏解读。解读⽤⼾输⼊时会从上⼀次解读遗留的第⼀个字符开始直到读完缓存或者遇到第⼀个不符合条件的字符为⽌。上⾯⽰例中 scanf() 读取⽤⼾输⼊时 %d 占位符会忽略起⾸的空格从 - 处开始获取数据读取到 -13 停下来因为后⾯的 . 不属于整数的有效字符。这就是说占位符 %d 会读到 -13 。第⼆次调⽤ scanf() 时就会从上⼀次停⽌解读的地⽅继续往下读取。这⼀次读取的⾸字符是 . 由于对应的占位符是 %f 会读取到 .45e12 这是采⽤科学计数法的浮点数格式。后⾯的# 不属于浮点数的有效字符所以会停在这⾥。什么是.45e12呢 其实 .45e12 是科学计数法表示的浮点数等价于0.45 *10^{12} 450000000000.45 是小数部分代表 0.45e12 代表乘以 10^{12}10的12次方在C语言中 scanf(“%f”) 可以识别这种格式会把 .45e12 完整解析为浮点数。2.为什么输出不一样输出是449999994880.000000输出结果不同主要是因为浮点数的存储精度和输出格式控制学过《计算机组成原理》的同学一定知道原理这里不是为我们学习的重点不做过多解释想了解的同学可以借助AI学习9.2.2 scanf的返回值scanf() 的返回值是⼀个整数表⽰成功读取的变量个数。如果没有读取任何项或者匹配失败则返回 0 。如果在成功读取任何数据之前发⽣了读取错误或者遇到读取到⽂件结尾则返回常量EOF(-1)。EOF - end of file ⽂件结束标志#includestdio.hintmain(){inta0;intb0;floatf0.0f;intrscanf(%d %d %f,a,b,f);printf(a%d b%d f%f\n,a,b,f);printf(r %d\n,r);return0;}输入输出测试如果输入两个数a是字符不是浮点型与%f匹配不上所以就没收到f的值结果r2在VS环境中按3次 ctrlz 才结束了输⼊,如果⼀个数字都不输⼊直接按3次 ctrlz ,输出的r是-1也就是EOF上面这个地方在算法竞赛中使用的非常频繁9.2.3 占位符scanf() 常⽤的占位符如下与 printf () 的占位符基本⼀致。• %c 字符。• %d 整数。• %f float 类型浮点数。• %lf double 类型浮点数。• %Lf long double 类型浮点数。• % s 字符串。• %[ ] 在⽅括号中指定⼀组匹配的字符⽐如 %[0-9] 遇到不在集合之中的字符匹配将会停⽌。【注】解释 %[ ]的使用上⾯所有占位符之中除了 %c 以外都会⾃动忽略起⾸的空⽩字符。 %c 不忽略空⽩字符总是返回当前第⼀个字符⽆论该字符是否为空格。如果要强制跳过字符前的空⽩字符可以写成 scanf( %c, ch) 即 %c 前加上⼀个空格表⽰跳过零个或多个空⽩字符。输入输出展示下⾯要特别说⼀下占位符 %s 它其实不能简单地等同于字符串。它的规则是从当前第⼀个⾮空⽩字符开始读起直到遇到空⽩字符即空格、换⾏符、制表符等为⽌。因为 %s 不会包含空⽩字符所以⽆法⽤来读取多个单词除⾮多个 %s ⼀起使⽤。这也意味着scanf() 不适合读取可能包含空格的字符串⽐如书名或歌曲名。另外 scanf() 遇到 %s 占位符会在字符串变量末尾存储⼀个空字符 \0 。//第一讲介绍过scanf() 将字符串读⼊字符数组时不会检测字符串是否超过了数组⻓度。所以储存字符串时很可能会超过数组的边界导致预想不到的结果。为了防⽌这种情况使⽤ %s 占位符时应该指定读⼊字符串的最⻓ 度即写成 %[m]s 其中的 [m] 是⼀个整数表⽰读取字符串的最⼤⻓度后⾯的字符将被丢弃。arr只能存5个超过的会报错因此这样写不安全正确展示9.2.4 赋值忽略符有时⽤⼾的输⼊可能不符合预定的格式。正确展示错误示例scanf中间是逗号控制台输入也必须是1020正确输出展示示例2为了避免这种情况 scanf() 提供了⼀个赋值忽略符assignmentsuppressioncharacter * 。只要把* 加在任何占位符的百分号后⾯该占位符就不会返回值解析后将被丢弃。示例上⾯⽰例中 %*c 就是在占位符的百分号后⾯加⼊了赋值忽略符 * 表⽰这个占位符没有对应的变量解读后不必返回。--------------------------------------------------------------------------------------------------------------------------本讲完