c语言的常见概念和数据类型及变量
main函数
1地位(程序运行的唯一入口 代码执行的起点与核心枢纽 )
2核心概念(是所有程序的起点 无论项目拆分多少个文件 工程中必须只能有一个main 缺少main函数的代码无法生成可执行文件)
库函数
为了提升开发效率 让程序员无需关心底层逻辑 直接调用这些现成的’工具函数’即可完成输入输出 数学运算 字符串整理等任务
关键字
1定义(c语言中被预先保留 赋予特殊含义的符号 如int return if)
2特性(在定义变量或函数时 严禁与关键字重名 c语言统一规定 无法创建和修改)
3类型(数据类型 如char signed 等/控制语句 如if/存储类 决定变量的生存周期与作用域范围/特殊关键字 如sizof 用于计算变量或数据类型的字节大小)
字符
计算机中用于表示文本的最小符号单元 涵盖字母 数字 标点以及特殊符号 必须用’'号 每个字符在内存中固定占用1个字节的存储空间
ASCLL编码
计算机通用的’字符宝典’ 让计算机能够读懂人类的文字符号
字符串
由一对"“号包裹的字符序列 是c语言处理文本的基础形式 如"hello world”
\0
1概念(c语言字符串末尾自动追加’\0’ 他是不可见的标志 标记着字符串的结束位置 如字符串"abc"看似是三个字符 实际上占用了4个字节的空间 也是函数的停止信号)
2作用(字符数组—手动赋值无终止符 代码输出后 因为printf未找到结束的标志 所以会持续读取内存中的二进制数据 所以后面会紧跟着代码和随机值 知道偶然遇到内存中某个位置的\0才会被迫停止/字符串常量—精准输出"abc"后会停止 因为编译器会在字符序列的末尾添加了一个不可见的\0字节)
转义字符
1定义(以反斜杠为引导 后跟一个或多个字符 用于表示’非打印字符’ ‘具有特殊功能的字符’ 让编译器把后面的字符当成特殊指令执行)
2本质(本质是ASCLL码值 格式有8进制\ddd 三位 16进制\xdd 两位)
语句和语句分类
1空语句(仅用一个";"组成的最简单的语句形式 它不产生任何实际操作 常用于语法上需要语句但逻辑上无需执行动作的场景)
2表达式语句(在赋值 算数或关系表达式末尾添加分号构成 是程序中最基础的执行单元 主要用于完成数据计算 变量赋值 状态更新)
3函数调用(由函数名 参数列表与分号组成 简而言之就是函数+()的形式 没有()就不叫函数调用 用于触发预定义的功能模块 实现代码复用 是c语言中执行特定任务的主要方式)
4复合语句(又称代码块 用一对大括号{} 将多条语句包裹成一个整体 在语法上它被视为单条语句 常用于界定变量作用域或作为控制结构的语句体)
5控制语句(决定程序的流向 是实现复杂逻辑的关键 它能够改变代码的顺序执行特性 主要分为分支语句和循环语句 通过这个可以实现程序设计的三大基本结构—顺序结构 选择结构 循环结构 这是编写高效 灵活切具有实质应用价值程序的基础)
注释
相当于是代码的说明书 是对代码的自然语言的说明 编译器会直接忽略此处内容 不会影响代码的运行
有符号类型signed
只能修饰char 所有整型 不能修饰浮点型 存放所有整形家族的最大值最小值在头文件<limits.h>
无符号类型unsigned
同样只能修饰整形家族 只能存非负数 不能存负数 全部二进制只能存数值 没有符号位 相反signed就有符号位 所以正数表示范围比signeg大
字符型char
一个字节8位整数 纯char是否带符号由编译器来决定 建议不要用char来纯负数 它的ddiceng逻辑是ascll编码 是数字 所以严格来说是属于整形家族
整形家族short int long longlong
用来存整数 存储长度依次递增 全部默认是signed 可以用unsigned来修饰只表示正数
浮点型float double longdouble
用来存小数 长度依次递增 不能用signed和unsigned来修饰 存放浮点型的精度极值 在头文件<float.h>
布尔类型bool
必须引入头文件<stdbool.h>才能使用别名bool true false
sizeof
1(不是函数 不是数据类型 是一个关键字 他有两种写法 一种是操作类型名 写的时候必须带括号 如sizeof(int)另一种是操作变量名 括号可以省略 如sizeof num 操作类型名的作用是查询数据类型的标准长度 操作变量名的作用是编译器自动识别这个变量是什么类型 在算出该类型的字节大小)
2 (sizeof的内部表达式不会实际执行 编译器仅识别表达式最终的数据类型 直接算出对应字节的长度 表达式逻辑会被直接丢弃 运行时完全不执行 如s=s+100 结果类型为short 占两个字节 直接返回为2 内部赋值代码被忽略)
size_t
是sizeof唯一的返回类型 标准占位符是%zu 如size_t=sizeof(double) 赋值运算符=将size-t类型数字8存入同类型变量s 当然 如果把sizofe直接放进printf 不需要定义变量 自然就不用size_t
变量
1概念 (变量是程序中用于存储和操作数据的基本单元)
2语法结构 (数据类型+变量名 如 int num)
3命名 (仅含字母数字下划线 首字符非数字 严格区分大小写 如num和Num是两个变量名 严禁使用关键字 如ing char)
4分类 (局部变量和全局变量 局部变量存定义在函数和代码块内 存储与栈区/全局变量定义在函数外部 存储与静态区 作用覆盖整个程序)
4访问优先级 (局部优先 当局部和全局变量同名时 程序会优先使用局部变量的值 避免全局变量被意外修改)
算术操作符
1概念 (用于执行基本数学运算的双目操作符 涵盖加减乘除取模等常用运算规则 直接决定数值处理的逻辑与结果)
2基础运算 (int a=2+3 int b=2-3 int c=2*3)
3除法运算 (整数除法:当操作符两边的数都是整数时 直接截断小数部分/浮点除法:只要有一个操作数时浮点数,结果就是浮点数)
4取模运算 (仅适用于整数 输出两数输出的余数 结果的正负号由第一个操作数的符号决定 利用取模运算可以迅速判断一个数是奇数还是偶数 如n%2=0)
单目操作符
1概念 (仅需要一个操作符即可完成运算 )
2自增++ (前置++:先变后用 执行时先将变量值+1 在参与后续的预算 如int a=10,b=++a//结果为a=11 b=11/后置++:先用后变 先使用变量当前值参与运算 运算结束后在+1 int a=10,b=a++//结果为a=11 b=10)
2自减-- (和自增++逻辑完全相同)
3正号+ (对计算结果无实质性影响 通常可以省略)
4减号- (用于改变数值的正负属性)
赋值操作符
1概念(时将数据保存到变量的核心手段 不仅可以支持基础的单次赋值 还可以通过连续赋值与符号赋值符为代码的书写提供的灵活性和简洁性 赋值都是从右到左)
2初始化和更新 (int num=100//初始化 num=200//更新)
3连续赋值 (a=b=c=5 太过于复杂 建议还是拆分多行书写)
4复合赋值 (书写更高效 a+=3等价于a=a+3)
5核心优势 (不仅能显著减少代码长度 降低笔误风险 兼顾了代码的可读性和执行效率)
强制类型转换
1概念 (将一种数据类型转换为另一种数据类型 是解决编译器不匹配警告的主动手段 但是还是不建议使用)
2示例 (浮点小数转整数 小数被直接截断 如int num=3.14//因为int是4个字节 而3.14属于double类型 是8个字节 这样写的话编译器会报错
这个时候int num=(int)3.14 //结果为3 所以强制转换不回进行四舍五入 有的时候还可能导致数据益出)
3最佳实践原则 (尽量避免不必要的强制转换 优先通过定义匹配的变量类型来保证类型一致)
printf输出函数
1基本用法(将参数文本 变量值等数据直接输出到控制台屏幕 支持通过%d %s等格式控制符 灵活定义输出内容的样式 排版与数据展示类型 用这个函数时必须要引入一个头文件include<stdio.h> printf默认不会换行 需要手动在字符串末尾添加转义字符\n实现换行 否则内容将连续拼接显示)
2占位符(占位符是输出文本中预留的’动态位置标记’ 程序运行时会自动将其替换为自己指定的变量或常量值 从而实现灵动的动态内容输出 占位符一%为起始标记 紧随其后的字符’d s f’定义了数据类型 二者共同构成了完整的格式说明符 “%d用于输出10进制整数 %s用于输出字符串 %f用于输出浮点数 %c用于输出单个字符” 占位符与后续参数必须严格匹配 若有n个占位符 printf就需要传入n+1个参数 若参数个数少于占位符 程序就会越界读取内存中随机的垃圾信息 导致数据结果不可控 甚至引发程序崩溃和安全漏洞)
3限定宽度(如格式符%5d 限定最小宽度 若内容长度不足时 左侧会补空格填充 默认右对齐 常用于数字列对齐 如%-5d 强制左对齐 与%5d相反 适用于文本类数据的左靠齐展示 浮点数宽度 如%12f包含整数位 小数点 和6位小数的特征 整体默认右对齐 精准控制列宽 这里设定的宽度仅为最小宽度)
4正负号与小数位数(在格式控制符前添加+号 如"%+d" 可强制输出结果始终携带符号标识 打破+号默认不显示的限制 常用于需要明确展示数值正负属性的场景 如财务报表 温度显示或数据对比分析 限制小数位数 如"%.2f" 此时就会保留两位小数位数 系统会自动进行四舍五入 常用于金额 百分比等精确小数的场景 宽度与精度的组合 如printf(“%6.2f”,0.5) 这个时候输出的结果就是 " 0.50" 动态参数替代 也叫通配符 使用号代替固定数值 宽度和精度由print的后续参数动态传入 实现运行时灵活控制 如print("%.*f",6,2,0.5))
5%s(默认输出:无数字字符修饰时 输出从指针起始位置到结束符’\0’的完整字符串内容/截取输出:如%5s 就输出字符串的前五个字符 超出部分截断 常用于控制输出宽度或截取固定长度信息)
scanf输入函数
1基本用法(从标准输入设备键盘中读取数据 并将其按照指定格式存储到对应的变量内存空间中 是实现人机交互的基础 当程序运行到scanf时会主动暂停 等待用户输入数据并按下回车键确认 输入完成后 数据被解析 程序继续向下执行 需要包含头文件include<stdio.h> 普通变量前必须加取符地址& 指针和数组除外)
2输入原理(基于缓冲区的流式读取机制 缓冲暂存:输入字符并非及时处理 而是先存入内存缓冲区 直至按下回车键才促发解析动作 空白过滤:自动跳过输入字符中的空白字符 精准定位有效数据 匹配终止:一旦遇到与格式字符不匹配的字符 立刻终止解析并返回)
3返回值(函数执行状态的直接反馈 成功匹配:返回成功读取并赋值的变量个数 如读取3个值则返回3/匹配失败:输入数据与格式符类型不匹配时 返回0 /结束标志:遇到文件结束符 如EOF 返回常量是EOF 值为—1)
4占位符和注意事项(%c不会自动跳过空白符 会直接读取 若在%c前面添加空格 即可忽略空白符 %s遇到空白字符立刻停止 必须限制读取长度 否者会造成缓冲区溢出 会影响程序的安全性)
5赋值忽略符"%*c"(如果用户在输入日期时 分隔符可能会混用 如2026-08-09 或2026/08/09 若使用普通写法scanf(“%d-%d-%d,&y,&m,&d”)遇到非"-"的分隔符会直接读取失败 导致程序无法支持兼容多种输入格式 而这个字符 表示读取但不保存 这个时候就可以实现输入格式的兼容
