C语言数据类型和变量
1.数据类型介绍
数据类型分为:
C语言本身就有的内置类型
字符型 chara 1Byte
整型 {
1.短整型 shourt [int] 2Byte
2.整型 int 4Byte
3.长整型 long [int] 4Byte
4.更长的整型 long long [int] 8Byte
[int]均可省略
}
浮点型 {
float 单精度浮点型 4Byte
double 双精度浮点型 8Byte
long double 8Byte
}
布尔类型 _Bool 或 bool 1Byte
专门表示真假,取值只能是true或false
布尔类型的使用必须包含头文件<stdbool.h>
自己创造的自定义类型
数组 结构体-struct 枚举-enum 联合体-union (以后了解)
2. signed 和 unsigned
signed和unsigned关键字修饰字符型和整型,signed可以表示正负,unsigned只能表示零和正整数
对于char类型 char默认是否带有正负号由当前系统决定
对于int类型 int默认为signed int
unsigned的优点是同样长度的内存能够表达的最大整数值扩大一倍
3.数据类型和取值范围
limits.h 、float.h 头⽂件中说明了整型类型和浮点型类型的取值范围
整型
char SCHAR_ MIN ( MAX ) UCHAR_MAX
short SHRT_ MIN ( MAX ) USHRT_MAX
int INT_ MIN ( MAX ) UINT_MAX
long LONG_ MIN ( MAX ) ULONG_MAX
long long LLONG_ MIN ( MAX ) ULLONG_MAX
浮点型
FLT_ DBL_
4.变量
创建
变量是根据类型创建的,变量创建的同时给一个初始值叫做初始化
给float类型的变量初始化时,初始值会默认为double类型,需要在结尾加上f,例如3.14f
分类
全局变量 大括号外部定义的变量,整个工程中都能使用
局部变量 大括号内部定义的变量,只能在所在局部范围内使用,局部变量较全局变量优先
全局变量放在内存的静态区,局部变量放在内存的栈区
5.算术操作符(双目操作符)
包括 + 、- 、* 、/ 、%
操作符也叫运算符,有两个操作数的操作符叫双目操作符
/
除号两端如果是整数,执行的是整数除法,结果也是整数,不能整除得到的是商没有余数
想要结果是浮点数,两个操作数中至少有一个浮点数,才能进行浮点数除法
%
求模(余),得到的结果是两个整数相除的余数,只能用于整数不能用于浮点数
负数求模的规则是,结果的正负由左操作数的正负决定
6.单目操作符
前置++、--
先运算,后使用
int a = 5;
int b = ++a
输出为 a = 6 ,b = 6
后置++、--
先使用,后运算
int a = 5;
int b = a--
输出为 a=4 ,b=5
+、-
代表正负号时,是单目操作符
7.赋值操作符:=和复合赋值
变量初始化后,再给一个值,叫做赋值
连续赋值 c=b=a+3 从右往左依次赋值 不推荐使用,建议拆开写,方便观察代码执行的细节
复合赋值 a + = 10 等价于 a = a + 10
a - = 3 等价于 a = a - 3
复合赋值操作符: += -= *= /= %= 等
8.强制类型转换
如 int a = 3.14 类型不匹配,编译器会报警
int a = (int) 3.14 为了消除警告,将3.14强制转换成 int 类型,只取整数部分
9. printf 和 scanf
printf 和 scanf 是在标准库的头文件 stdio.h 定义的,使用之前要引入这个头文件
printf
print—打印,f (format)—格式化,printf表示可以定制的格式将文本输出到屏幕上
占位符
打印在屏幕上是占位符的位置将被其他参数替换
如果参数个数少于对应的占位符,可能会输出内存中的任意值
常用的占位符
%c :字符
%d :十进制整数
%f :⼩数(包含 float 类型和 double 类型)
%hd :十进制shortint类型
%hu :unsignedshortint类型
%ld :十进制longint类型
%lu :unsignedlongint类型
%Lf :longdouble类型浮点数
%p :指针(用来打印地址)
%s :字符串
%u :无符号整数(unsignedint)
%x :十六进制整数
%zd : size_t 类型
限定宽度
例如 %5d表示这个占位符的宽度至少为5位,如果不满五位,对应值的前面会添加空格补齐
输出的值默认是右对齐,如果改成左对齐,即在输出内容后面补齐空格,应写成 %-5d
限定小数位数
例如 %.2f 表示小数点后只保留两位
这种写法可以与限定宽度占位符结合使用 %6.2f 表输出的浮点数最小宽度为6,小数位为2
最小宽度和小数位数这两个限定值,都可以用 * 代替,通过printf () 的参数传入
printf ("%*.*f\n", 6, 2, 0.5); 等同于 printf ("%6.2f\n",0.5);
显示正负号
printf 只对负数显示-,如果想对正数显示+,应在%号后插入+,%+d保证输出的值总带有+-
printf ("%+d\n",12); 输出+12
printf ("%+d\n",-12); 输出-12
输出部分字符串
例如 %.5s 表示只输出字符串的前五个字符
scanf
读取用户的输入,将其存入变量
读取原理
scanf 处理数值的占位符时会自动过滤空白字符,包括空格、制表符、换行符等(%c除外)
所以,用户输入的数据之间使用空格或回车键不影响数据的解读
当scanf ("%d %f",&a,&b); 读取 -13.45e12# 0时
%d 占位符会忽略起首的空格,从 - 处开始获取数据,读取到-13停止,后面的 . 不属于整数的有效字符,所以占位符%d 会读到-13
第⼆次调用 scanf时,会从上一次停止解读的地方,往下读取。这⼀次读取的首字符是 . ,由于对应的占位符是 %f ,会读取到 .45e12 ,这是采用科学计数法的浮点数格式。后⾯的 # 不属于浮点数的有效字符,所以到此为止
返回值
scanf 的返回值是一个整数,表示成功读取的变量个数,没有读取到数据或匹配失败则返回0
在成功读取任何数据之前,发生了读取错误或者遇到读取到⽂件结尾,则返回常量EOF(-1)
EOF— end of file 文件结束标志
按 ctrl+z(VS环境需要按三次),可以提前结束输入
如果一个数据都没有输入就提前结束输入,返回值是-1
占位符
%c :字符
%d :整数
%f : float 类型浮点数
%lf : double 类型浮点数
%Lf : long double 类型浮点数
%s :字符串
%[ ] :指定⼀组匹配的字符(如 %[0-9] ),遇到不在集合之中的字符,匹配将会停止
%c
除%c 外,其他占位符都会自动忽略起首的空白字符
%c 总是返回当前第⼀个字符,无论该字符是否为空格
如果要强制跳过字符前的空白字符,可以写成 scanf(" %c", &ch) ,即 %c 前加上⼀个空格,表示跳过零个或多个空白字符
%s
%s的规则是,从当前第⼀个非空白字符开始读起,直到遇到空白字符(即空格、换行符、制表符等)为止,所以无法读取多个单词(除非使用多个%s)
scanf 遇到 %s会在字符串变量末尾存储一个空字符 \0,所以长度5的字符组只能存储4个数据
scanf 不会检测读取的字符串是否超过了数组长度。所以储存字符串时,可能会超过数组的边界,导致预想不到的结果
为了防止这种情况,可以写成%9s 表示读取字符串的最大长度为9,将后面的字符抛弃
赋值忽略符
有时,用户的输⼊可能不符合预定的格式,导致数据读取失败
如果输⼊ 格式,比如 2024-04-02 ,就会正确解读出年、月、日。
但是当输入 2024/04/02 ,这种情况下, scanf 解析数据就会失败
为了避免这种情况, scanf() 提供了⼀个赋值忽略符 *
只要把 * 加在任何占位符的百分号后面,表示这个占位符没有对应的变量,解读后不必返回
例如scanf ("%d%*c%d%*c%d" &year,&month,&day);
这样就能解决上述问题