一.数据类型介绍
在C语言中,需要知晓数据类型才能让编译器更好地操作数据
类型有:1.内置型:字符型,整型,浮点型,布尔类型
2.自定义类型:数组,结构体,枚举,联合体
这里先了解内置型
1.字符型
2.整型
3.浮点型
float——单精度浮点类型
double——双精度浮点类型
4.布尔类型
4.1.C语⾔原来并没有为布尔值单独设置⼀个类型,⽽是使⽤整数 在 C99 中也引⼊了 布尔类型,是专⻔表示真假的
或者
,两者都可以用
4.2.布尔类型的使⽤得包含头⽂件<stdbool.h>
4.3.布尔类型变量的取值是:ture或false , 编译器一般默认0为假,非0为真
5.提示:以上[ ]中的字符,均可省略
***补充:6.各数据类型长度
6.1.sizeof操作符:sizeof是⼀个关键字,也是操作符,专⻔是⽤来计算sizeof的操作符数的类型⻓度的,单位是字节(Byte) , Byte=8bit ;
6.2.sizeof操作符的操作数可以是类型,也可是变量或者表达式;
6.3.sizeof后边的表达式是不真实参与运算的,根据表达式的类型来得出大小;
6.4.sizeof的计算结果是size_t类型的,打印使用%zd;
6.5.C语言规定sizeof(long) >= sizeof(int) , double和long double同理;
(以上可以得知各类型长度)
6.6.C语言中没有规定sizeof运算符的返回值的类型,由系统去决定,就会有以下可能性:
unsigned int ————使用%u打印
unsigned long ————使用%lu打印
unsigned long long ————使用%llu打印
解决:C语言对此创建了一个类别名size_t , 用来统一表示sizeof的返回类型,可以直接对应unsigned int和unsigned long long ,而size_t 用%zd打印
6.7.如果sizeof中放的是表达式,则表达式不会真实计算
例:
错误思维:s=10+1=11 , 11为int类型,第一个输出4
原因:sizeof不真实计算,s为short类型,则按s原来的类型输出
总结:sizeof在代码进⾏编译的时候,就根据表达式的类型确定了,⽽表达式的执⾏却要在程序运⾏期间才能执⾏,在编译期间已经将sizeof处理掉了,所以在运⾏期间就不会执⾏表达式了
二.signed和unsigned
1.两者都是来修饰 字符型 和 整型 类型的;
2.signed关键字,表示⼀个类型带有正负号,包含负;
unsigned关键字,表⽰该类型不带有正负号,只能表示零和正整数;
3.对于int类型,默认是带有正负号的,也就是说,int等同于signed int;
4.对于char,char是否有符号取决于编译的实现,大部分编译器上char和signed char等价;
5.对于无符号整数,用%u打印;
6.整型变量声明为unsigned的好处是同样⻓度的内存能够表示的最⼤整数值,增⼤了⼀倍
例如:16位的signed short int的取值范围是-32768~32767,最大是32767;
而unsigned short int的取值范围是0~65535,最大值增大到65535
三.数据类型的取值范围
可以使用everything软件查看系统上不同数据类型的极限值:
limits.h 文件说明了整型类型的取值范围;
float.h这个头文件说明浮点型类型的取值范围;
四.变量
1.创建:data_type name;
| |
数据类型 变量名
变量在创建时会给一个初始值,这叫初始化;
2.分类:全局变量:在⼤括号外部定义的变量就是全局变量 全局变量的使⽤范围更⼴,整个⼯程中想使⽤,都是有办法使⽤的;
局部变量:在⼤括号内部定义的变量就是局部变量 局部变量的使⽤范围是⽐较局限,只能在⾃⼰所在的局部范围内使⽤的。
注意:当局部变量和全局变量同名的时候,局部变量优先使⽤
3.在学习C/C++语⾔的时候,会关注内存中的三个区域:栈区、堆区、静态区。
3.1. 局部变量是放在内存的栈区
3.2. 全局变量是放在内存的静态区
3.3. 堆区是⽤来动态内存管理的
五.算数操作符:+,-,*,/,%
算数操作符是为了方便计算,分为双目操作符(有两个操作数)和单目操作符(只有一个操作数);也被称作运算符
1.+,-,*
对应加法,减法,乘法;
2./
对应除法,
注:2.1.除号的两端如果是整数,执⾏的是整数除法,得到的结果也是整数;
C语⾔⾥⾯的整数除法是整除,只会返回整数部分,丢弃⼩数部分;
2.2.如果希望得到浮点数的结果,两个运算数必须至少有⼀个浮点数,这时C语⾔就会进⾏浮点数 除法;
3.%
对应求模(余)运算,即返回两个整数相除的余值。
注:3.1.这个运算符只能用于整数,不能用于浮点数。
3.2.负数求模的规则是,结果的正负号由第一个运算数的正负号决定。
六.赋值操作符:=和复合赋值
1.=是一个随时可以给变量赋值的操作符;
2.连续赋值:
不过还是尽量不要这么写分开,方便调试
3.复合赋值符:化简写法
上下两条语句等价
同理,有:+= ,-= ,*= ,/= ,%=
还有:>>= ,<<= ,&= ,|= ,^=(暂时不了解)
七.单目操作符:++,--,+(正),-(负)
1.++和--:
分为前置和后置
前置:先a加1,后使用a的值
后置:先使用a的值,后给a加1
2.+和-:
都是单目操作符,表示正负,和数学里的用法一致
八.强制类型转换
例子:如果,会报错:
那么可以将他强制转化类型:,这样就不会报错了
注意:会损失数据,少用
九.scanf和printf介绍
scanf:
1.基本用法
功能:打印;需要头文件:stdio.h;
2.占位符:
所谓“占位符”,就是这个位置可以⽤其他值代入
常见的有:%c:字符; %d:十进制整数; %f:小数(包含float和double类型) ;
%hd:十进制 short int类型; %lu:unsigned long int 类型;
%lf:long double 类浮点数; %p:指针(用来打印地址);
%s:字符串; %u:无符号整数(unsigned int); %x:十六进制整数;
%zd:size_t类型 %%:输出一个百分号......
注:printf()参数与占位符时一一对应关系,如果有n个占位符,printf()的参数就应该有n+1个,如果参数个数少于对应的操作符,printf()可能会输出内存中的任意值。
3.输出格式:
printf可以定制输出格式
3.1.限定宽度:
例1中:%6d指的是这个占位符的宽度⾄少为5位,如果不满5位,对应的值的前⾯会添加空格
而%-6d指的是在输出内容后⾯添加空格;
例二中:%14f表示表示输出的浮点数最少要占据12位,而小数的默认显示精度是小数点后6位,所以在前面补4个空格
特别注意:小数点占一个宽度
3.2.显示正负号:
使用%+d进行打印,这样输出的值总是带有正负号
3.3.限定小数位数:
情况1:限定小数点后的位数 保留n位,占位符使用%.nf
例:
情况2:同时限定宽度为n和小数点位为m,占位符使用%n.mf
例:
3.4.限制输出字符串:
可以使用%.[n]s来限定输出长度,其中[n]为数字,表示要限定的长度
例:
scanf:
1.基本用法:
1.1.可用键盘给变量输入值
1.2.运行到scznf()函数就会停下,等待输入,并将输入的值存入变量
1.3.需要头文件stdio.h
1.4.处理用户输⼊的原理:用户的输⼊先放⼊缓存,等到按下回⻋键后,按照占位符对缓存进⾏解读。 解读⽤⼾输⼊时,会从上⼀次解读遗留的第⼀个字符开始,直到读完缓存,或者遇到第⼀个不符合条件的字符为⽌。
1.5.&为取地址操作符
例:
第一次读了"-25",第二次读了".45512"
2.占位符
2.1.scsnf()和print()用法差不多,scanf( ,& )
2.2.scanf()处理数值占位符时,会自动过滤空白字符,包括空格,制表符,换行符等,因此用户输入多个空格还是换行都不影响
特例:使用%c时,不会忽略空白字符;不过可以在"%"和"c"直接加一个空格,表示忽略字符开头前的空白字符
3.3.赋值忽略符(*)
当使用"%d -%d-%d-"输入年月日"2025-06-28"时,总会有人输入"2025/06/28/",可以使用赋值忽略符来规避报错:
在%c中间加入*,表示这个占位符没有对应的变量,解读后不必返回
3.返回值
3.1.scanf() 的返回值是⼀个整数,表示成功读取的变量个数。
3.2.如果没有读取任何项,或者匹配失败,则返回 0 。
3.3.如果在成功读取任何数据之前,发⽣了读取错误或者遇到读取到⽂件结尾,则返回常量EOF(-1)。 EOF-endoffile ⽂件结束标志。
3.4.按ctrl+z可以提前结束输入
3.5.若不使用返回值需要加:#define _CRT_SECURE_NO_WARNINGS 1
例: