C临界知识知识知识
目录
C临界知识知识知识
第一讲:C常见概念
项目与程序:
关键字与函数对比:
转义字符:
第二讲:数据类型与变量
占位符大汇总(AI) (A~Z方便查找) (此章节过长 建议点击目录跳过)
占位符的灵活使用
输出格式
一、限定宽度
1.整型
2.浮点型
3.字符串
输入
输出
二、限定符号
三、const与static 对变量的限制:
第三讲:分支与循环
else究竟与哪个if匹配?
switch内各语句的规范
随机数的生成
第一讲:C常见概念
项目与程序:
项目如
:
project13
、通讯录项目
程序如:
test.c Push.c Contact.c Contact.h
文件 : 把
.c
为后缀的⽂件称为源⽂件,把
.h
为后缀的⽂件称为头⽂件
关键字与函数对比:
| 来源 | 语言内置 | 标准库/自定义 |
| 数量 | 固定(32个C关键字) | 无数 |
| 修改 | 不可修改 | 可自定义 |
| 调用 | 语法结构 | 函数调用() |
| 重名 | 禁止 | 允许(可能冲突) |
| 作用 | 定义语法结构 | 封装功能 |
转义字符:
\\ddd ddd表示1~3个
八进制数字
\\xdd dd表示2个
十六进制数字
第二讲:数据类型与变量
占位符大汇总(AI) (A~Z方便查找) (此章节过长 建议点击目录跳过)
| 浮点型 | ||||
| %a | 十六进制浮点数(小写) | 按 IEEE 754 标准输出,格式:0x尾数p指数,仅支持 float/double | printf("%a", 3.14f); | 0x1.91eb86p+1 |
| %A | 十六进制浮点数(大写) | 与%a一致,仅字母(X/P)大写 | printf("%A", 3.14f); | 0X1.91EB86P+1 |
| %e | 科学计数法(小写 e) | 格式:尾数e±指数,默认保留 6 位小数 | printf("%e", 1234.56); | 1.234560e+03 |
| %E | 科学计数法(大写 E) | 与%e一致,仅指数部分 E 大写 | printf("%E", 1234.56); | 1.234560E+03 |
| %f | 十进制小数 | 支持 float/double,默认保留 6 位小数,整数部分完整显示 | printf("%f", 3.14); | 3.140000 |
| %g | 自适应浮点数(小写 e) | 最多 6 位有效数字,整数部分超 6 位自动转科学计数法,省略末尾无意义的 0 | printf("%g", 1234567.89); | 1.23457e+06 |
| %G | 自适应浮点数(大写 E) | 与%g一致,仅指数部分 E 大写 | printf("%G", 1234567.89); | 1.23457E+06 |
| %Lf | long double 型小数 | 专门适配长双精度浮点型,需变量为 long double | long double ld = 3.14L; printf("%Lf", ld); | 3.140000 |
| %Le | long double 型科学计数法 | 专门适配 long double,指数部分小写 e | long double ld = 1234.56L; printf("%Le", ld); | 1.234560e+03 |
| 整型(基础) | ||||
| %c | 单个字符 | 输出 ASCII 码对应的字符 | printf("%c", 65); | A |
| %d | 十进制有符号整数 | 适配 int,输出负数会带-号 | printf("%d", -123); | -123 |
| %i | 十进制有符号整数 | 与%d功能完全一致,scanf 中%i可识别八进制(0 开头)/ 十六进制(0x 开头) | printf("%i", 0123); | 83(0123 是八进制,转十进制为 83) |
| %u | 十进制无符号整数 | 适配 unsigned int,负数会按无符号规则转换(如 – 1→4294967295) | printf("%u", -1); | 4294967295(32 位系统) |
| %o | 八进制无符号整数 | 无前缀 0,仅输出数字 | printf("%o", 10); | 12 |
| %x | 十六进制无符号整数(小写) | 无前缀 0x,字母 a-f 小写 | printf("%x", 255); | ff |
| %X | 十六进制无符号整数(大写) | 无前缀 0X,字母 A-F 大写 | printf("%X", 255); | FF |
| 整型(长度限定) | ||||
| %hd | 十进制 short int | 限定输出短整型,避免 int 截断错误 | short s = 123; printf("%hd", s); | 123 |
| %ho | 八进制 short int | 适配 short int 的八进制输出 | short s = 10; printf("%ho", s); | 12 |
| %hx | 十六进制 short int(小写) | 适配 short int 的十六进制输出 | short s = 255; printf("%hx", s); | ff |
| %hu | 无符号 short int | 适配 unsigned short int | unsigned short us = 255; printf("%hu", us); | 255 |
| %ld | 十进制 long int | 限定输出长整型,适配 long 类型 | long l = 123456789; printf("%ld", l); | 123456789 |
| %lo | 八进制 long int | 适配 long int 的八进制输出 | long l = 10; printf("%lo", l); | 12 |
| %lx | 十六进制 long int(小写) | 适配 long int 的十六进制输出 | long l = 255; printf("%lx", l); | ff |
| %lu | 无符号 long int | 适配 unsigned long int | unsigned long ul = 255; printf("%lu", ul); | 255 |
| %lld | 十进制 long long int | 适配长长整型,32/64 位系统通用 | long long ll = 123456789012; printf("%lld", ll); | 123456789012 |
| %llo | 八进制 long long int | 适配 long long int 的八进制输出 | long long ll = 10; printf("%llo", ll); | 12 |
| %llx | 十六进制 long long int(小写) | 适配 long long int 的十六进制输出 | long long ll = 255; printf("%llx", ll); | ff |
| %llu | 无符号 long long int | 适配 unsigned long long int | unsigned long long ull = 255; printf("%llu", ull); | 255 |
| %zd | size_t 类型 | 适配 sizeof 返回值(无符号),避免类型不匹配 | int arr[5]; printf("%zd", sizeof(arr)); | 20(int 占 4 字节,5×4=20) |
| 其他类型 | ||||
| %s | 字符串 | 输出以\\0结尾的字符数组,遇\\0停止 | printf("%s", "hello"); | hello |
| %p | 指针地址 | 输出指针的十六进制地址(带 0x 前缀),32 位输出 8 位,64 位输出 16 位 | int a=10; printf("%p", &a); | 0x0012FF40(32 位示例) |
| %n | 统计已输出字符数 | 不输出内容,将已输出字符数存入指定 int 变量(需传地址) | int cnt; printf("abc%n", &cnt); printf("%d", cnt); | 3(先输出 abc,cnt=3) |
| %% | 输出百分号 | 转义符,避免 % 被识别为格式符 | printf("%%"); | % |
sizeof(计算式) //求的是类型大小计算式不计算 因为在编译期间已经将sizeof去掉
| 算术操作符/运算符 | 位操作符 | 赋值符 |
| + | & | = |
| – | | | += |
| * | ~(按位取反) | -= |
| / | ^ | *= |
| % | << | /= |
| >> | …… | |
| …… |
占位符的灵活使用
输出格式
%lf %f 的输出均默认为6位小数
符号、小数点均计入长度
// 2位 7位
printf("%+*.7f", 12, 99.9114514); //"%+12.7f"
// 符号+1位
输出" +99.9114514"
1 3 1 7 == 12
(空格)
一、限定宽度
1.整型
printf
(
"%5d\\n"
,
123
);
//
输出为
" 123"
' 5 '表示至少显示5位
printf
(
"%-5d\\n"
,
123
);
//
输出为
"123 " //'' – '' 进行左对齐
2.浮点型
格式:%x.yf //x同上
printf("%3.2f",3.2342); //输出"3.23"
3.字符串
输入
char name[m] = {0};
scanf("%[m]s",name); //防越界
输出
格式%.[m]s //表示输出m个字符
printf("%.5s",hello world); 输出"hello"
二、限定符号
printf("%+d\\n", 12) ; // 输出 +12
printf("%+d\\n", -12); // 输出 -12
三、const与static 对变量的限制:
const 限制只读与不可更改性 //决定是常量还是变量。 如:
//const决定常量还是变量
//1.常量
const int max = 99;
//2.变量
int max = 99;
static 限制生命周期与存储方式 决定数据是否为静态是否存储于静态区。 如:
//static决定是否是静态
//1.静态变量
static int min = 0;
//2.静态常量
static const int min = 0;
第三讲:分支与循环
else究竟与哪个if匹配?
else总是与在同一个 {}内的 未匹配else的 最近的 if结合。
switch内各语句的规范
1.case value1:
statement;
break;
2.default:
statement;
break;
//若default在case前 反汇编中其实是default在所有case之后 //有如下代码与反汇编指令:
int main()
{
int i = 0;
switch (i)
{
default:
printf("无");
break;
case 1:
printf("1");
break;
case 2:
printf("2");
break;
}
return 0;
}
部分反汇编如下:
00007FF6742918BC cmp dword ptr [rbp+00000000000000D4h],1
00007FF6742918C3 je 00007FF6742918DD
//case1的判断
00007FF6742918C5 cmp dword ptr [rbp+00000000000000D4h],2
00007FF6742918CC je 00007FF6742918EC
//case2的判断
随机数的生成
rand srand //include<stdlib.h>
time //<time.h>
a~b
a+rand()%(b-a+1)


