C语言入门基础2
本章内容1.C语言数据类型及变量1数据类型简单介绍在C语言中它提供了丰富的数据类型来描述生活中的各种数据比如我们去超市买东西买完东西之后收银员会给我们一个小票小票上的信息大概如下表单号名称单位单价数量小计15666麻辣王子袋5.00元315.00元15777白象泡面桶4.50元29.00元我们对这个表格进行简单的分析发现单号整数名称文本单位文本单价小数数量整数小计小数那么在C语言中我们使用整型类型来描述整数使用字符类型来描述字符使用浮点型来描述小数所谓类型就是i相似的数据所拥有的共同特征编译器只有知道了数据的类型才知道怎么去操作数据。在C语言中数据类型分为以下两个大类如下图字符型char [signed] char //有符号的 unsigned char //无符号的整型//短整型 short [int] [signed] short [int] unsigned short [int] //整型 int [signed] int unsigned int //长整型 long [int] [signed] long [int] unsigned long [int] //更长的整型C99中引入的 long long [int] [signed] long long [int] unsigned long long [int]上面代码中的[ ]内容是可以省略的比如[signed] int是等价于int的。浮点型float //单精度浮点型 double //双精度浮点型 long double //更长的浮点型布尔类型:起初C语言并没有为布尔值单独设置一个类型而是使用整数0表示假非零值表示真在C99中引入了布尔类型是专门用来表示真假的。_Bool其变量的取值是true或者false使用布尔类型需要添加相对应的头文件stdbool.h。这个代码意思就是如果flag为真就执行if下面语句如果flag为假就执行else下面的语句if else语句后面会讲解到时侯各位道友就懂了。数据类型的长度既然有了数据类型那我们就来看一下数据类型的大小我们求数据类型的长度是需要用到sizeof这个关键字的sizeof同样也是一个操作符它是专门用来计算sizeof的操作数的类型的长度的单位是字节。sizeof操作符的操作数可以是类型也可以是变量或者表达式比如sizeof(类型) sizeof 表达式那么上面代码中sizeof后面括号中的内容便是sizeof的操作数这里也只演示了它的操作数是类型的情况下至于它的操作数是表达式的情况还望各位道友可以在自己的电脑上练习操作一下其实要学好C语言最重要的一个环节就是敲代码不要觉得你自己眼睛会了真正上手操作的时候发现还是不会哈这就很尴尬。不同的编译器相同的类型可能有不同的值比如说有的编译器中的long的值就是8而不是4。2signed和unsigned简单介绍C语言是使用signed和unsigned关键字来修饰字符型和整型类型的。signed关键字表示一个类型带有正负号包含负值。unsigned关键字表示该类型不带有正负号只能表示零和整数。对于int类型默认是带有正负号的所以上面也说到int等同于signed int但是如果我们想要我们的数据不包含负值那么定义变量的时候就要用到unsigned这样也有另外一个好处就是同样长度的内存能够表示的最大整数值增大了一倍比如16位的int取值范围是-32768~32767而unsigned int取值范围则是0~65535最大值增大到了65535比32767增大一倍。注意C语言规定char类型默认是否带有正负号是由当前系统决定的也就是说char不等同于signed char这一点与int不同但是在VS2026软件系统中char是等同于signed char的。3数据类型的取值范围数据类型类型标识符字节数取值范围短整型short2-32768~32767整型int2或4同short或long取决于C编译系统长整型long4-2^31~2^31-1无符号短整型unsigned short20~65535无符号整型unsigned int2或4同unsigned short或unsigned long无符号长整型unsigned long40~2^32-1单精度浮点型float4-3.4*10^-38~3.4*10^38双精度浮点型double8-1.7*10^-308~1.7*10^308字符型char1ASCII码0~127有符号字符型signed char1-128~127无符号字符型unsigned char10~2554变量和常量简单介绍C语言中把经常变化的值称为变量不变的值称为常量。变量创建的语法形式如下datatype name;| || |数据类型 变量名变量命名的规则是只能由字母包括大写和小写数字和下划线_组成不能以数字开头长度不能超过63个字符变量名中是区分大小写的比如int A和int a就是两个变量变量名不能使用关键字int a; //整型变量 char c; //字符变量 float n; //浮点型变量 double f; //浮点型变量变量在创建的时候给一个初始值就叫初始化。int a 10; char c m; float n 6.5; double f 3.14;变量的分类全局变量在大括号外部定义的变量就是全局变量全局变量的使用范围广整个工程中都可以使用。局部变量在大括号内部定义的变量就是局部变量局部变量的使用范围比较局限只能在自己所在的局部范围内使用。那如果全局变量的局部变量名字相同呢在全局变量和局部变量相同的时候局部变量是优先使用的但最好不要给全局变量和局部变量给相同的名字那么我们在给变量起名字的时候可以稍微有意义比如你的数据想要描述一群人的年龄那么我们就可以定义为int age 0如果是体重就可以是float weight 0.0f5操作符简单介绍算数操作符、-、*、/、%我们在写代码的时候一定会涉及到计算C语言就提供了一系列操作符其中一组就是算数操作符而算数操作符也是双目操作符因为它有两个操作数。和-#include stdio.h int main() { int a 20 26; int b 20 - 26; printf(%d\n,a); //输出46 printf(%d\n,b); //输出-6 return 0; }*#include stdio.h int main() { int a 5; int b 6; printf(%d\n,a*b); //输出30 return 0; }/这个运算符需要特殊注意#include stdio.h int main() { int a 6 / 4; float b 6 / 4; printf(%d,a); printf(%d,b); return 0; }首先a的值是1b的值是1.000000很奇怪为什么不是1.5对吧因为a是一个整型变量它得到的值一定会是一个整数所以肯定不会得到小数。那么为什么b是一个浮点型变量得到的值还不是1.5呢因为这就跟操作符两端的操作数有关了要想得到的结果为小数两端的操作数必须至少有一个为小数得到的结果才能是小数。这就是C语言除法运算符里我们需要特殊注意到的东西。%求模运算符只能用于两个整数之间进行运算得到的结果是两个整数的余数#include stdio.h int main() { int a 6 % 4; printf(%d\n,a); //a的值为26除4的余数是2 return 0; }这是正数的求模规则那么负数的求模规则是由第一个操作数的正负号决定#include stdio.h int main() { printf(%d\n,6%4); //结果是2 printf(%d\n,-6%4); //结果是-2 printf(%d\n,6%-4); //结果是2 return 0; }赋值运算符int a 20//初始化a 200 //赋值这里使用的就是赋值操作符它也是一个双目操作符单目操作符--正号-负号和--分为前置-- 和后置--前置int a 10;int b a;printf(a %d b %d\n); //a的值为11b的值为11计算口诀先1后使用a原来是10先1后变为11后使用就是再赋值给bb也为11前置- - int a 10;int b --a;printf(a %d b %d\n); //a的值为9b的值为9计算口诀先-1后使用a原来是10先-1后变为9后使用就是再赋值给bb也为9后置int a 10;int b a;printf(a %d b %d\n); //a的值为11b的值为10计算口诀先使用后1a原来是10先使用后赋值给bb为10然后再1a为11后置- - int a 10;int b a--;printf(a %d b %d\n); //a的值为9b的值为10计算口诀先使用后-1a原来是10先使用后赋值给bb为10然后再-1a为9总而言之前置或--就是先1或-1后使用后置或--就是先使用后1或-1。和-正号和负号运算符号对正负值没有影响。int a 10; 等价于 int a 10;运算符-号用来改变一个值的正负号在一个正数前面加一个 -号 让其变为负数在一个负数前面加一个 -号 让其变为正数。int a 10;int b -a;int c -10;printf(b %d c %d,b,c); //这里的b和c都是-10int a -10;int b -a;printf(b %d,b); //这里的b是106强制类型转换强制类型转换顾名思义就是把一个类型的值强制转换为另一个类型的值比如int a 3.14但是a是一个整型变量而我们要把3.14这个浮点型值赋给a显然是不可能的这时候我们只需要把这个代码改为 int a (int)3.14;就可以了但是这样保存下来的值是要舍去小数部分的最终a的值就是3各位道友发现没有强制类型转换它其实不安全因为它很可能会造成数据的丢失所以我们使用强制类型转换的时候是万不得已才去使用的一般情况下就不要去使用了。那么为什么说它很可能会造成数据丢失呢在VS2026编译器中浮点型值默认为double类型如果想让它是一个float类型的值在后面加f就好比如3.14f那么前面说到double类型是占8个字节的而int类型是占4个字节的那么如果强制把8个字节的数据存放到4个字节的空间大小里是存不下的那如果你非要存进来我就会把多余4个字节的数据给截断那就会造成数据丢失就好比你非要把1升的水装进500毫升的瓶子里那结果不就是多余的500毫升水溢出去了对吧。7printf、占位符、scanfprintfprintf函数是一个库函数它的作用是将参数文本输出到屏幕它也可以指定输出文本的格式比如最开始那个C语言代码#include stdio.h int main() { printf(Hellow World); return 0; }上面的命令就是在屏幕上输出一行文字Hellow World而printf()不会在行尾自动添加换行符运行结束后光标就停留在输出结束的地方不会自动换行为了让光标移到下一行的开头就需要在输出文本的结尾添加换行符\n。如果文本内部需要换行也可以插入换行符\n来实现。既然printf函数可以打印字符串那么也可以打印其他类型的数据比如#include stdio.h int main() { int n 100; char c m; float f 5.20; printf(%d\n,n); printf(%c\n,m); printf(%f\n,5.20); return 0; }这里的%d%c等都是占位符会被后面的值替换同时我们使用printf这个库函数是需要包含头文件的就是stdio.h。占位符所谓占位符就是这个位置可以用其他值代入就好比大家上课都有帮朋友占座位的时候用一本书把那个位置占着直到你朋友来之后他就坐在那个座位里了是一个道理我们来看下面这个代码#include stdio.hint main(){printf(There are %d apples\n,3);return 0;}代码里的%d就是一个占位符表示这个位置用其他值来替换后面我可以填3也可以填其他数字但必须是整数因为%d是表示十进制的整数。而我们使用占位符的时候第一个字符一律是%第二个字符表示占位符的类型%d表示这里代入的值必须是一个整数十进制的整数。当然在输出文本里也可以有多个占位符而printf()参数与占位符是一一对应关系如果有n个占位符printf()的参数就应该有n1个如果参数个数少于对应的占位符printf()可能会输出内存任意值比如说占位符列举%c字符%d十进制整数%f小数包含float类型和double类型%hd十进制short int类型%hu:unsigned short int类型%ld十进制long int类型%luunsigned long int类型%lld十进制long long int类型%Lflong double类型浮点数%p指针用来打印地址%s字符串%u无符号整数unsigned int类型%x十六进制整数%zdsize_t类型%%输出一个%这些是常用的一些占位符当然还有很多占位符不是很常用我这里就不再介绍了。前面也说到printf()可以指定输出格式限定宽度#include stdio.h int main() { printf(%5d\n,123); //输出为 123 return 0; }%5d表示这个占位符的宽度至少为5位如果不满5位对应的值的前面会添加空格输出的值默认为右对齐如果希望是左对齐把%5d改为%-5d。 #include stdio.h int main() { printf(%-5d\n,123); //输出为123 return 0; } 对于小数来说这个限定符会限制所有数字的最小显示宽度比如输出 123.450000 #include stdio.h int main() { printf(%12f\n,123.45); //输出为 123.450000 return 0; } %12f表示输出的浮点数最少要占据12位由于小数的默认显示精度是小数点后6位所以123.450000输出结果前面加两个空格。总是显示正负号默认情况下printf()不会对正数显示号但是会对负数显示-号如果想让正数显示号可以在占位符的%后面加一个#include stdio.h int main() { printf(%d\n,12); //输出12 return 0; }限定小数位数输出小数的时候如果想要保留后两位就可以写成%.2f#include stdio.h int main() { printf(%.2f\n,12.3456); //输出12.35 return 0; }那如果想要限定最小宽度的同时又想保留小数位数就可以写成%12.2f输出 12.35输出部分字符串%s占位符用来输出字符串默认是全部输出如果只想输出开头的部分可以用%.[m]s指定输出的长度其中[m]代表一个数字表示所要输出的长度比如#include stdio.h int main() { printf(%.5s\n,hello world); //输出hello return 0; } scanf当我们创建了变量之后我们也可以给变量输入值这时候就需要用到scanf这个函数了也可以说它是一个输入函数那么printf函数就是一个输出函数对吧它们两其实是一对函数使用这两个函数需要添加的头文件是相同的都是stdio.h我们来看下面这段代码这就是一个简单的输入输出代码。scanf基本用法scanf()函数是用来读取用户的键盘输入程序运行到这个语句的时候会自动停下来等待用户从键盘的输入用户在输入数据之后按下entre键scanf()就会处理用户的输入将其存入变量它的语法基本是和printf()基本一样哈。int i 0scanf(%d,i);它的第一个参数是一个格式字符串里面会放置占位符与printf()的占位符基本一致来告诉编译器如何解读用户的输入需要提取的数据是什么类型这是因为C语言的数据都是有类型的scanf()必须知道用户输入的数据类型才能处理数据。上面示例中scanf()的第一个参数是%d表示用户要输入的数据是一个整数第二个参数是i将用户从键盘输入的整数存入变量i。注意的是变量前面必须加上运算符指针变量除外因为scanf()传递的不是值而是地址即将变量i的地址指向用户输入的值。scanf()返回值scanf()的返回值是一个整数表示成功读取的变量个数如果没有读取到任何数据或者读取失败就返回0如果在成功读取任何数据之前发生了读取错误或者遇到读取到文件结尾则返回常量EOF-1EOFend of file文件结束标志。而在scanf()中的占位符基本是和printf()的占位符一致除了浮点型有点区别因为printf()中的float类型和double类型都使用%f但是在scanf()中float类型使用%fdouble类型使用%lf。虽然前面说scanf()占位符会忽略起首空白字符但是%c不会因为空格也是字符。本篇文章内容就先到这里哈也感谢各位道友支持我们下篇文章再见