C语言知识梳理第一期 知识梳理第一期本人仅分享个人学习C语言过程中遇到的重难点问题以及踩坑仅供参考。本人使用的编程软件为VS 20261 . ASCII码值ASCIIAmerican Standard Code for Information Interchange美国信息交换标准代码是计算机中最基础的字符编码标准。它用 7 位二进制数0~127来表示 128 个字符包括英文字母、数字、标点符号以及一些控制字符。理解 ASCII 码是理解 C 语言中字符与整数关系的第一步。几组常用数据字符A~Z 65 ~ 90字符a~ z 97 ~ 122实际上你只需要记住一共有26个字母A对应65且a与A的ASCII码值差值为32即可轻松记住所有字母的ASCII码值。数字字符0~9的ASCII码值从48 ~ 57附表ASCII码表2 . 常用转义字符\n换行符 将光标移动到下一行的开头\0空字符 字符串的结束标志ASCII 值为 0。\反斜杠 表示它们“字面”的含义双引号 表示它们“字面”的含义’单引号 表示它们“字面”的含义?问号 在书写连续多个问号时使用用于防止多个问号被编译器误认为是三字母词。插播一下三字母词trigraph是C语言的一种早期特性用三个字符的序列以 ?? 开头来表示单个字符例如 ?? 会被替换为 #、??/ 被替换为 \。虽然现代编译器默认已不推荐使用了但标准仍保留了这一特性。? 的作用就是防止 ??? 被误解析为三字母词的开头。八进制: \ddd1~3 位八进制数字例如 \101 代表 ‘A’因为 A 的 ASCII 是 65八进制为 101十六进制: \xdd1~2 位十六进制数字例如 \x41 代表 ‘A’因为 A 的 ASCII 是 65十六进制为 413 . 数据类型3.1 字符型在C语言中用char表示字符类型3.2 整型在C语言中用int表示整型类型3.3 浮点型float单精度浮点数通常占 4 字节。double双精度浮点数通常占 8 字节精度更高最常用long double扩展精度浮点数通常占 8、12 或 16 字节3.4 布尔类型_Bool: 用于表示真假3.5 各种数据类型的长度接下来内容我觉得对新手很不友好先介绍一个关键字sizeof装逼一点说sizeof是一个一元运算符用于以字节为单位返回操作数类型或表达式的存储大小结果类型为 size_t。讲人话sizeof就是用来量数据在电脑里占了几个格子。注意事项sizeof 后面主要跟以下四类数据1.1数据类型名称必须加括号sizeof (int);// 测量基本类型sizeof (double);// 测量浮点类型sizeof (struct Node);// 测量自定义的结构体类型sizeof ( int * );// 测量指针类型1.2变量名括号可省int a 10;sizeof a ;// 测量变量 a 的大小1.3各种表达式括号通常建议保留sizeof(10 3.14);// 结果是 8因为 int double 结果是 double 类型sizeof(i);// 结果是 4且 i 的值不会增加sizeof( func( ) );// 结果取决于 func() 的返回值类型若返回 int 则为4且 func() 不会被调用注意不能是函数本身sizeof(func) 是非法的因为函数名不能直接代表一个数据对象但 sizeof(func()) 是合法的因为它测量的是函数返回值的类型。1.4数组名特殊在 C 语言中数组名通常会自动退化为指针但在 sizeof 后面是唯一的例外。当数组名作为 sizeof 的操作数时它代表的是整个数组。int arr[10];sizeof(arr);// 结果是 40 (10个元素 × 4字节)而不是指针的大小(8)sizeof 的计算结果是size_t类型的。size_t类型在 printf 中使用的专属占位符是%zu。.优先级陷阱极易出错sizeof 作为一个一元运算符它的优先级非常高仅次于括号、后缀自增/自减等。现象当它与其他运算符混合使用时如果不加括号很容易产生意想不到的结果。示例int a 10;printf(“%zu\n”, sizeof a 10);// 错误直觉先算 a10再求大小// 实际执行sizeof(a) 10 - 结果是 4 10 14// 正确做法如果真想算表达式的大小必须加括号printf(“%zu\n”, sizeof(a 10));// 结果是 43.6 数据类型长度3.6.1char (1 字节)bool(1 字节short (2 字节)int (4 字节)float (4 字节)long (在 32位系统或 Windows 下的 VS2026中占4 字节在 64位 Linux 系统中占 8 个字节)long long (8 字节)double (8 字节)指针类型 (void *) (8 字节)long double (在vs2026中占8 字节在gcc环境中占16字节)注意如果是编程新手的小伙伴们可能会被这些名词弄得晕头转向所以我在下面列举一些我学习中遇到的困惑希望能够帮助到大家。Q 字节是什么鬼A “字节”英文叫 Byte通常简写为 B是计算机中用来表示存储空间大小的最基本计量单位规定 8 个位bit 1 个字节Byte。那么bit又是什么呢位bit是计算机最小的数据单位只能存 1 个 0 或 1。更具体点说1 个字节由8 个 0 或 1组成比如 01000001。这 8 个 0 和 1 的组合刚好可以表示 256 种不同的状态0~255足够用来表示英文字母、数字和标点符号了。Q double和float在使用中的区别是什么A 1.C 语言中所有的小数常量如 3.14默认都是double 类型。如果你写 float f 3.14;编译器会报警告因为把高精度赋给低精度会丢失数据必须写成float f 3.14f;才行。如果你直接用 double f 3.14;则完全合法且不会有任何警告。2.float输入必须用%f。double输入必须用%lf如果用 %f 读入 double 会导致数据错误因为%f只分配了4 字节的空间而 double 需要8 字节。。输出时float 用%fdouble 用%f或%lf都可以。3.注意**“精度丢失”**问题float的极限只有6~7 位有效数字。如果你写 float a 123456.789f;打印出来可能是 123456.789062后面的数字已经错乱了。double的表现有15~16 位有效数字能精确表示更多位数。大数加小数的 “吞没 ” 效应当 float 的数值非常大时例如 16777216.0f当你加10000结果会正常变成 16787216.0f但是如果给它加 1结果依然是 16777216.0f。因为它的精度不够根本表示不出这个 1 的变化。4.绝对不要直接用 “” 比较浮点数由于上述的精度丢失问题浮点数的计算结果往往带有微小的误差。错误示范if (0.1 0.2 0.3)。这个判断在 C 语言中是假False的。正确做法通过判断两个数的差值是否小于一个极小值误差容限来比较。例如#include math.h#define EPS 1e-6if (fabs(a - b) EPS) { … }如果你有兴趣了解上面这段代码可以自行去问下AI在这里我不过多赘述。5.在实际开发中绝大多数情况下默认推荐使用double。在现代计算机的 CPU 架构下处理 double 和 float 的速度差距已经非常小了日常应用几乎感觉不到性能损耗。Q short,long,long long是什么意思**A **在 C 语言中short、long和long long都是整型Integer的修饰词。使用建议默认用 int95% 以上的情况普通的 int 就完全够用了。需要大数用 long long如果你在做算法题发现普通的 int 算出来结果不对溢出了直接无脑换成 long long。尽量别用 long因为 long 在不同系统下大小不一样Windows 下是 4 字节Linux 下是 8 字节跨平台移植时容易出 Bug。3.7 signed和unsignedC 语言使用 signed 和 unsigned 关键字修饰字符型和整型类型。signed关键字表示一个类型带有正负号包含负值unsigned关键字表示该类型不带有正负号只能表示零和正整数。对于int类型默认是带有正负号的也就是说int等同于signed int。由于这是默认情况关键字signed一般都省略不写但是写了也不算错。Q 使用unsigned的好处是什么A 同样长度的内存能够表示的最大整数值增大了一倍。比如16位的signed short int的取值范围是: -32768~32767最大是32767而unsigned short int的取值范围是: 0~65535最大值增大到了65535。unsigned int里面的int可以省略所以以下两行代码效果相同。1unsigned int a;2unsigned a;字符类型char也可以设置signed和unsigned。1signed char c;// 范围为 -128 到 1272unsigned char c;// 范围为 0 到 255注意C语言规定char类型默认是否带有正负号由当前系统决定。这就是说char不等同于signed char它有可能是signed char也有可能是unsigned char。日常使用时如果你只是把 char 当作纯粹的字符来使用比如存英文字母、标点符号或者处理普通的文本字符串直接写 char 即可。当你把 char 当作极小的整数来参与数学计算、或者处理底层数据时必须明确加上修饰词。这一点与int不同int就是等同于signed int。接下来我们要学习一个比较深入的概念。在 C 语言中字符char本质上就是整数数字之前我已经粗略介绍过ASCII 码表 计算机不知道什么是字母 ‘A’什么是汉字它只认识数字0 和 1 的组合。在 C 语言中charcharacter虽然名字叫“字符”但它在内存中实际上就是一个占 1 个字节的小整数。当你写char c ‘A’;时计算机在内存里实际存下的数字是 65因为 ASCII 表规定 A 对应 65。当你写char c ‘a’;时计算机存下的数字是 97。当你写char c ‘0’;时注意这不是数字 0而是字符 0它在内存里存下的数字是 48。Q 既然 char 本质上就是数字那我直接用 int 不就行了为什么还要搞个 charA 因为int 通常占 4 个字节而 char 只占 1 个字节。如果你只是存一个字母用 int 会浪费 75% 的空间。并且分不同情境是使用 int 和 char可以使语义更清晰。例当你写下 char c ‘A’; 时任何看到这段代码的程序员都会立刻明白“哦这里存的是一个字符”。如果你写 int c 65;别人看代码时会疑惑“这是一个计数器还是数组下标还是某个状态码” 你必须额外写注释去解释它其实是个字符增加了沟通成本。同时我必须要解释另一个重要的问题在 C 语言中变量最终被打印成什么样子完全取决于你使用的 % 占位符格式说明符而不是变量本身的类型。例1.char c ‘A’;底层真相内存里存的是数字 65。输出%cprintf(“%c”, c); 告诉编译器“把它当字符看”输出 A。输出%dprintf(“%d”, c); 告诉编译器“把它当整数看”输出 65。2.int c 65;底层真相内存里存的也是数字 65。输出%dprintf(“%d”, c); 告诉编译器“把它当整数看”输出 65。输出%cprintf(“%c”, c); 告诉编译器“把它当字符看”输出 A。以上是我个人学习中遇到的难点问题希望能够对你有帮助虚心接受一切批评与指正欢迎讨论