数据类型和变量
一、数据类型
1. 分类
(1)内置类型
- 字符
[signed]char
有符号字符unsigned char
无符号字符
- 整型
- 短整型
[signed] short [int]
unsigned short [int]
- 整型
[signed] int
unsigned int
- 长整型
[singed] long [int]
unsigned long [int]
- 更长的整型(C99引入)
[signed] long long[int]
unsignedlong long[int]
- 浮点型
float
单精度double
双精度long double
- 布尔类型(C99引入)
_Bool
包含头文件<stdbool.h>
- 变量取值:
true
(1) orfalse
(0)
_Bool love=true;
if(love)
printf("Zhengzhouyue loves Fuyusen!\n");
(2)自定义类型
- 数组
- 结构体(
struct
) - 枚举(
enum
) - 联合体(
union
)
2. signed unsigned
- 修饰字符型和整型
- signed包含负值
- unsigned非负值
- 二者取值范围不同
char
默认是否带±号,由当前系统决定,有可能是signed
也有可能是unsigned
(即char
不等同signed char
int
等同于signed int
3. 取值范围
SCHAR_MIN
,SCHAR_MAX
:signed char
的min、maxSHRT_MIN
,SHRT
:short
的min、maxINT_MIN
,INT_MAX
:int
的min、maxLONG_MIN
,LONG_MAX
:long
LLONG_MIN
,LLONG_MAX
:long long
UCHAR_MAX
:unsigned char
的maxUSHRT_MAX
:unsigned short
的maxUINT_MAX
:unsigned int
的maxULONG_MAX
:unsigned long
的maxULLONG_MAX
:unsigned llong
的max
二、变量
经常变化的值----变量
1. 创建
- 初始化:创建时给数值
char ch='z';
double x= 47.68;
double x= 47.68f; //等价于↓
float x=47.68;
2. 分类
(1)全局变量
适用范围广
(2)局部变量
大括号内
- 二者同名时,局部变量优先使用
(3)两种变量在内存中的存储位置
- 栈区 —— 局部变量、函数参数
- 堆区 —— 动态内存管理、
malloc
、calloc
、realloc
、free
函数 - 静态区 —— 全局变量、静态变量
三、操作符
1. 算术操作符
+ - * / %
均为双目操作符
(1)/
- 整数除法:两边是整数
- 尽管变量类型是float,结果也只返回整数部分,丢弃小数部分
float x=6/4;
int y=6/4;
printf("%f\n",x); //输出1.000000
printf(%d\n",y); //输出1
- 小数除法:至少一个是浮点数
float x=6.0/4; //或6/4.0
printf("%f\n",x); //输出1.500000
(2)%
- 不能用于浮点数
- 结果的±号由第一个运算数的正负决定
printf("%d\n", 11 % -5); // 1
printf("%d\n",-11 % -5); // -1
printf("%d\n",-11 % 5); // -1
2. 赋值操作符
- 创建时给值——初始化
- 创建好后给值——赋值
int a=100; //初始化
a=200; //赋值
==表示相等
(1)连续赋值
从右向左依次赋值,且式子要在最右边
int a=5;
int b=2;
int c=0;
c=b=a+3; //不可写成c=a+3=b,a+3必须在最右边
(2)复合赋值符
a+=3;//a=a+3;
+= -= *= /= %=
>>= <<= &= |= ^=
3. 单目操作符:++、–、+、-
辨析
y=++x:x’=x+1 , y= x+1=x’
y=x++:y=x , x’=x+1
y=–x:x’=x-1 ,y= x-1=x’
y=x–:y=x , x’=x-1
4. 强制类型转换
int a=(int)3.14;//将3.14强制转换为整型,**只取整数部分**
四、输入输出函数
1. printf函数
- 头文件
#include <stdio.h>
- 运行结束后,光标停留在输出结束的地方
(1)占位符
- printf()函数可以输入占位符:%d(代入值必须为整数)、%s(代入的是字符串)
printf()的参数和占位符一一对应关系,若有n个占位符⇒printf()的参数有n+1个;若参数个数<对应占位符,则会输出内存中的任意值
- 常用占位符
%c
:字符。
%p
:指针。
%s
:字符串。
%zd
: size_t 类型。
%d
:⼗进制整数。
%f
:⼩数(包含 float 类型和 double 类型)。
%o
:⼋进制整数。%x
:⼗六进制整数。%u
:⽆符号整数(unsigned int)。%i
:整数,基本等同于 %d 。
%a
:⼗六进制浮点数,字⺟输出为⼩写。%A
:⼗六进制浮点数,字⺟输出为⼤写。
%e
:使⽤科学计数法的浮点数,指数部分的 e 为⼩写。%E
:使⽤科学计数法的浮点数,指数部分的 E 为⼤写。
%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 long int 类型。%llu
:unsigned long long int 类型。
%Le
:科学计数法表⽰的 long double 类型浮点数。%Lf
:long double 类型浮点数。
%n
:已输出的字符串数量。该占位符本⾝不输出,只将值存储在指定变量之中。%%
:输出⼀个百分号。
(2)输出格式
- 最小宽度——%bf
printf("%5d\n",123); //输出为“ 123”(123前面空两格)
输出的值默认右对齐(所以输出内容前面会有空格),如果要改为左对齐,则在%后插入-号:
printf("%-5d\n",123); //输出为“123 ”(空格在123后面)
- 小数的输出格式
默认显示精度是小数点后六位(%f)
printf("%12f\n",123.45); //输出“ 123.450000"(小数点占一位)
小数点后保留a位数:%.af(a代表数字);%b.af——最少b位,小数位数a
printf("%.2f\n",0.155); //输出 0.15
printf("%6.2f\n",0.5); //最小宽度为6,小数位数为2.输出“ 0.50”(前面有空格)
- 最小宽度和小数位数用参数传入**("%*.f",b,a,x)*
printf("%*.*f\n",6,2,0.5); //输出“ 0.50”
- 默认情况不显示+只显示-,让正数也带上符号
printf("%+d\n",12); //输出 +12
printf("%+d\n",-12); //输出 -12
- 输出部分字符串——用%.[m]s指定输出长度,[m]为数字
printf("%.5s\n","hello world"); //输出“hello”
2.scanf函数
(1)基本概念
- 头文件
#include <stdio.h>
- 传递的是地址→变量前加&,若为指针变量(字符串变量),则不用加&
- 自动过滤空白字符(空格、制表符、换行符)→即便scanf没加空格,键盘上输入也可以加空格/回车
- 解读:从上一次解读遗留的第一个字符开始直到读完缓存,或遇到第一个不符合条件的字符为止
int x;
float y;
// ⽤⼾输⼊ " -13.45e12# 0"
scanf("%d", &x);//只解读-13
scanf("%f", &y);//从.开始读取,因为对应的是%f,读取到.45e12即0.45×10^12
- 返回值——整数
没有读取任何项/匹配失败,则返回 0 ;在成功读取任何数据之前,发⽣了读取错误/遇到读取到⽂件结尾,则返回常量 EOF。
(2)常用占位符
①**%c
:字符——只有它不忽略空白字符,其余都自动忽略起头的空白字符**
- 强制跳过零个或多个字符前空白字符:
sacnf(" %c",&ch)
,在%c前加一个空格
② %s
:不能简单地等同于字符串,从当前第⼀个⾮空⽩字符开始读起,直到遇到空⽩字符(即空格、换⾏符、制表符等)为⽌。
- ⽆法⽤来读取多个单词⇒不适合读取可能包含空格的字符串(书名、歌名)
- scanf()遇到
%s
会在字符串变量末尾存储一个空字符**\0**
//输入"abc de"
scanf("%s",&num);//在c后面存\0,而不是在e后面
- 指定读入字符串的最长长度:%[m]s——避免读入字符数组时超过数组边界
③其他:
%d
;%f
:float 类型浮点数。
%lf
: double 类型浮点数。%Lf
: long double 类型浮点数。
%[ ]
:在⽅括号中指定⼀组匹配的字符(⽐如 %[0-9] ),遇到不在集合之中的字符,匹配将会停⽌。
(3)赋值忽略符
** 号加在%后*,占位符就不会返回值,解析后被丢弃
scanf("%d-%%d-%d",&y,&m,&d);//如果输入2024/1/24就会解析失败
//为解决问题:加*号,注意要给%c中间加,字符就不会返回值
scanf("%d%*c%d%*c%d",&y,&m,&d);//2024-1-24或2024/1/24都可以
五、生活小记
小付emo留言区
今天是10.22的凌晨三点十分,我们分手了。我实在不知道该哪里留言了。只希望你还能继续撰写博客吧。你把我微信删了,我也迅速作出了回应。我想拉黑微信,又害怕拉黑以后记录没了。只好不再显示假装自己也把你删了。我去了支付宝,qq,兔兔,小红书,网易云,qq音乐,我们的协作文档。都没有你的消息。我想你也许和我一样彻夜难眠吧。于是我就想到了这里,这里也是个留言板,如果你近期会写博客的话。你删除我微信,我真的很心疼。那里有我们所有的所有。我连微信小号也舍不得删 ,因为那里也有一部分我们的回忆。我很难过,我也想气你,我注销了小红书,注销前我认真看了一遍我们的收藏夹,我们有那么多收藏夹从美食,景点到考研,学习再到家庭布置,财产规划。在爱情里面稚嫩的我们认真的规划着我们的未来。像是大人眼里执着的小孩理想的看着未来。
我好想你,你在哭吗。
我不觉得
我细数着我们的过往,眼泪止不住地流淌。我们有着很炽热的一段感情,即便它并不完美,但我相信在我们眼里这就是最棒的爱情。
已经和好如初了。