目录
1 数据类型介绍
1.1 字符型 char 占位符是%c
1.2 整型 int 占位符是%d
1.3 浮点型 单精度float 双精度double 打印时的占位符分别是%f %lf
1.4 布尔类型 _Bool 专门表示真假 ture与false 使用时必须有头文件#include<stdbool.h>
占位符如下表
1.5 各种数据类型的长度
使用 sizeof 操作符
计算的结果的单位是字节 打印时的占位符为%zd
char : 1 bool : 1 short : 2
int : 4 float : 4 long : 4或8
double : 8 long long: 8 long double : 8或16 (与标准有关)
注: sizeof中的计算式并不会求值 如下:
s为int类型 占4字节 但a b为double类型 占8个字节 最终结果由s自己决定 s是int类型 因此计算的sizeof最终结果还是4个字节 而由于sizeof并不会抢时计算 所以s的值并不会改变
signed和unsigned的区别
signed 表示 有符号的 既有正负
unsigned 表示 无符号的 既只有正数
注: 只修饰字符型和整型 既修饰char类型和int类型的
使用unsigned时 会使能够存储的最大值变大一倍 就好比signed的short int类型是从 -32768~32768 而unsigned的长度就是从0~65535 就好比把负数的长度移动到了正数上 一般不加是默认是signed类型 既signed int ==int
而char默认是signed类型并不能确认 由编译器决定 c语言并没有给出具体标准 现目前VS中 signed char == char
sizeof的返回值类型是 size_t (无符号整型) 用%zd打印
2 变量 常量
变量是什么呢?
变量就是会改变的量 有我们自己设定 在程序过程中可以修改
变量命名规则
字母数字下划线组成 不以数字开头
大小写敏感 不可超过63个字符 不可使用关键字
变量分为 局部变量和全局变量
全局变量: 定义在大括号外
局部变量 : 定义在大括号外
全局变量和局部变量重名时 局部变量优先使用
但若在括号外使用局部变量则会报错 因为局部变量只能在作用域中 (括号内) 使用
而在括号外使用局部变量则会报错 如下
创建变量就是在内存中开辟区域来存放数据
而不同类型的变量就会存放在不同的区域
三个存放变量的区域
1 栈区 : 局部变量 函数参数
2 堆区 : 用于动态内存管理 malloc calloc realloc free
3 静态区 : 全局变量 静态变量
生命周期
变量的生命周期指的是:变量从创建到被销毁之间的时间段
局部变量的生命周期: 从作用域开始到出作用域 生命周期结束
全局变量的生命周期: 整个程序的生命周期
作用域
按我理解 就是在程序中数据的有效使用空间
局部变量的作用域
变量所在的局部范围 一般是 { } 内部
全局变量的作用域
整个程序
常量是什么呢?
常量就是指的不会改变的量
C语言常见的常量分为以下几种:
字面常量
例如: 1 5 10.22 'a' "abcdef "等可以从字面上读出来的量
const修饰的常变量
例如: const int a=100; 此时 a这个变量被const修饰 则a变为了常变量
a只是变成了不可修改的变量而已 既常变量 编译器依旧会认为它是变量属性
例如定义数组则会报错 int arr[a]; 此时依旧会报错
#define定义的标识符常量
例如: #define O 100; 此时就将O定义为了标识符常量 值为100
枚举常量
enum是定义枚举类型的关键字 而Color是一种枚举类型
enum Color
{ red , green , blue , };
//red green blue 是枚举类型Color的可能取值 是常量 叫枚举常量
enum Color c=red; // 定义了一个枚举类型 c 赋值为red
3 算数操作符和赋值操作符
算数操作符
有 + - * / %
其中% 表示取余 不会四舍五入 是直接舍去小数部分 而且只能用于整数计算
注 : 负数求模的规则 结果的正负号由第一个运算数的正负号决定
赋值操作符
如图 有解释
注: 全局变量不初始化时 默认为0 而局部变量不初始化 值是随机的 并会报错
单目操作符
++ -- +(正号) -(负号) {只需要一个操作数}
关于 a++ 和 a--
a++ 和 ++a 之后 a都等于a+1 a-- 和 --a同理
区别在于 a++这个式子等于a 而++a这个式子等于a+1
4 printf和scanf
printf :
printf是将参数文本打印在屏幕上 但不会换行 为了让输出的文本换行 可以在末尾加上 \n
printf("小寒是笨蛋\n"); 将在屏幕上输出 小寒是笨蛋
其中\n也可以放在句子中间 例如 printf("小寒\n是笨蛋") 将会输出如下情况
而还有一种输出方式 既使用占位符
printf("%s是一个baby","小寒"); 其中%s为字符串的占位符 表示占取一个位置 打印如下
占位符
占位符不止%s 有许多 我将常见的列举于下
其中占位符还可以限制宽度 如下
其中若宽度不够 会使用空格进行补齐 而若宽度超过则直接打印 因为限制的是最小宽度
若宽度不够 %5d 是向右靠齐 而%-5d 是左靠齐
而%5.2d 表示最小宽度为5 小数点后保留2位 多的四舍五入 并且不限制时 %d小数点后默认6位
使用强制类型转换是舍去小数点 而使用限制小数是四舍五入
还有一种额外的限定方法 使用printf的传参来使用
既 printf("%*.*f\n",6,2,-1.456);
甚至可以输出字符串的前几位
scanf:
scanf 在vs上会报错 他会认为scanf不安全 只需要在前面加上#define _CRT_SECURE_NO_WARNINGS 即可
scanf 返回的是读取到的数据的数目 是int类型
如下
print + scanf 是一队函数
scanf在输入时 除开%c都会自动忽略起手空白字符(空格)
如果在输入%c的时候也想跳过起手空白字符需要在%c前加入一个空格
例 scanf(" %c",&c); ----- 其中&为取地址符号 ----- %c前是一个空格
其中在使用%s的时候需要注意 %s在读取字符串的时候是不包含空白字符的(空格 换行符 制表符)
并且scanf()遇到%s时 还会在末尾加上一个\0
如下 输入sss ss 输出sss
假如想要在%s输入时 将空格也录入进去 可以这样写代码
在%9[^\n]中 ------[^\n]表示遇到\n才结束输入
------9表示scanf只录入9个数据
因为留一个给\n 如果输入超过9个时会报错 这样会避免报错 直接使用输入数据的前9个
在
scanf
函数中,%*c
和%c
的区别如下:1.
%c
- 功能:读取一个字符(包括空白字符如空格、换行符
\n
等),并将其存储到对应的变量中。- 示例:
char ch; scanf("%c", &ch); // 读取输入的下一个字符,存入ch
- 输入
A
,则ch
的值为'A'
。2.
%*c
- 功能:读取一个字符但不存储到任何变量中(
*
表示忽略赋值)。通常用于跳过不需要的字符(如输入缓冲区中的换行符)。- 示例:
int num; char ch; scanf("%d", &num); // 读取整数(遇到换行符停止,换行符留在缓冲区) scanf("%*c%c", &ch); // 跳过换行符,读取下一个字符
- 输入
123\nA
:
- 第一次
scanf
读取123
,换行符\n
留在缓冲区。%*c
跳过\n
,%c
读取'A'
存入ch
。关键区别
格式 是否存储字符 典型用途 %c
是 读取并保存字符 %*c
否 跳过字符(清理输入缓冲区) 常见场景
清理缓冲区:
当输入中混入多余字符(如换行符)时,用%*c
跳过:scanf("%d%*c", &num); // 读取整数后跳过紧随的换行符
精确读取:
若需要读取特定格式(如X-Y
),可用%*c
跳过分隔符:scanf("%c%*c%c", &a, &b); // 读取形如"A-B"的输入,跳过中间的'-'
总结
%c
:正常读取字符并保存。%*c
:读取但丢弃字符,常用于处理输入中的干扰项。根据是否需要保留字符选择合适的格式符。