一、C 语言与编程语言的类型发展
C 之后的编程语言向两个方向分化发展,核心差异体现在类型检查的重视程度:
- 强类型方向:C++、Java,强调类型定义,对类型的检查更为严格;
- 弱类型方向:JavaScript、Python、PHP,不看重类型,无需事先定义变量类型。
类型安全的争议
- 支持强类型:明确的类型定义能帮助程序员尽早发现程序中的简单错误;
- 反对强类型:过度强调类型会迫使程序员关注底层实现,而非业务逻辑本身。
类型强调的规律
- 早期的编程语言普遍强调类型;
- 面向底层开发的编程语言会强调类型;
- C 语言要求变量定义类型,但对类型的安全检查并不足够。
二、sizeof 运算符
- 核心功能:作为运算符,返回某个类型或变量在内存中占据的字节数,语法:
sizeof(int)、sizeof(i); - 关键特性:静态运算符,计算结果在编译时刻就已确定;
- 使用注意:不要在 sizeof 的括号内执行运算,括号内的运算不会被实际执行。
三、整数类型
基本整数类型及字节数
表格
| 类型 | 字节数 | 说明 |
|---|---|---|
| char | 1 字节(8 位) | 既是整数类型也是字符类型 |
| short | 2 字节 | 短整型 |
| int | 取决于编译器 / CPU | 通常表示 “1 个字” |
| long | 取决于编译器 / CPU | 通常表示 “1 个字” |
| long long | 8 字节 | 长整型 |
整数的二进制表达
计算机内部所有整数均以二进制存储,正数直接存储二进制原码,负数通过补码存储,0 的二进制为00000000(1 字节为例)。
二进制负数的表示方案
1 字节的二进制范围为00000000 - 11111111,表示负数有三种方案,C 语言采用补码方案:
- 仿照十进制,设置特殊标志位表示负数;
- 取中间值为 0,小于该值为负、大于为正;
- 补码:满足负数 + 其绝对值 = 0的二进制规则(超出位数直接舍弃)。
补码的核心逻辑
以 1 字节的-1为例,希望-1 + 1 = 0:
- 1 的二进制:
00000001 - -1 的补码:
11111111 - 计算:
11111111 + 00000001 = 100000000,舍弃超出 1 字节的最高位,结果为00000000(即 0)。
1 字节整数的数值范围(补码)
表格
| 二进制范围 | 对应十进制 | 类型 |
|---|---|---|
00000000 | 0 | 零 |
00000001~01111111 | 1~127 | 正数 |
10000000~11111111 | -128~-1 | 负数 |
整数的输入输出格式符
仅区分int和long long,无符号类型需对应专用格式符:
表格
| 类型 | 输入输出格式符 |
|---|---|
| int | %d |
| unsigned int | %u |
| long long | %ld |
| unsigned long long | %lu |
8 进制与 16 进制
- 16 进制:4 位二进制对应 1 位 16 进制,适合表达二进制数据;
- 8 进制:1 位 8 进制对应 3 位二进制,因早期计算机字长为 12 的倍数(非 8)而设计。
整数类型的选择原则
- 设计底层程序时,为精准操作内存选择对应类型;
- 无特殊需求时,优先选择 int:现代 CPU 字长多为 32/64 位,一次内存读写 / 计算的单位为 int,更短类型不会更快甚至更慢;
- 内存对齐:现代编译器会做内存对齐优化,短类型实际占用内存可能与 int 一致(
sizeof仍返回实际字节数); unsigned仅影响输出形式,变量内部的计算逻辑无差异。
四、浮点类型
基本浮点类型及特性
C 语言主要浮点类型为float和double,核心参数如下:
表格
| 类型 | 字长(位) | 数值范围 | 有效数字 | 特殊值 |
|---|---|---|---|---|
| float | 32 | ±(1.20×10⁻³⁸ ~ 3.40×10³⁸) | 7 位 | 0、±inf、nan |
| double | 64 | ±(2.2×10⁻³⁰⁸ ~ 1.79×10³⁰⁸) | 15 位 | 0、±inf、nan |
浮点类型的输入输出格式符
float和double的输入格式符有差异,输出可通用%f/%e(科学计数法):
表格
| 类型 | 输入格式符 | 输出格式符 |
|---|---|---|
| float | %f | %f、%e |
| double | %lf | %f、%e |
科学计数法的书写规则
- 用
e或E表示指数,例:-5.67E+16; - 指数前可加
+/-,省略则表示正; - 小数点可选,整个表达式无空格。
浮点运算的精度问题
- 程序中带小数点的字面量默认是 double 类型,定义 float 变量需加后缀
f/F,例:float a = 1.345f;; - 浮点运算存在精度误差,禁止直接用
==判断两个浮点值是否相等。
浮点数的内部表达
- 由符号位、指数位、尾数位组成(double 为例:1 位符号 + 11 位指数 + 52 位尾数);
- 浮点计算由 CPU 专用硬件部件实现,
float和double使用相同计算部件。
浮点类型的选择原则
无特殊需求时优先选择 double:现代 CPU 可直接对 double 做硬件运算,性能与 float 无差异;64 位机器中,double 的存储速度也不慢于 float。
五、字符类型(char)
char 是特殊的整数类型,同时用于表示字符,核心特性:
- 字面量:用单引号包裹,例:
'a'、'1'、'"'; - 输入输出:格式符为
%c; - ASCII 编码:字符在内存中以 ASCII 码(整数)存储,例:
'1'的 ASCII 码是 49,char c=49等价于char c='1'。
大小写字母转换
- 字母在 ASCII 表中连续顺序排列,但大写和小写字母分开存储;
- 转换公式:利用
'a'-'A'获取大小写的编码差值(固定为 32)- 大写转小写:
字符 + ('a'-'A') - 小写转大写:
字符 + ('A'-'a')
- 大写转小写:
转义字符(逃逸字符)
用于表示无法直接打印的控制字符 / 特殊字符,以 ** 反斜杠 ** 开头,与后续字符组成一个字符,常用转义字符:
表格
| 转义字符 | 意义 | 转义字符 | 意义 |
|---|---|---|---|
| \b | 回退一格 | " | 双引号 |
| \t | 制表位(Tab) | ' | 单引号 |
| \n | 换行 | \ | 反斜杠本身 |
| \r | 回车 | - | - |
使用示例:printf("如输入\"57\"表示5英尺7英寸:");
六、类型转换
C 语言的类型转换分为自动类型转换和强制类型转换,核心原则为避免数据丢失。
自动类型转换
- 触发条件:运算符两边的操作数类型不一致;
- 转换规则:向表达范围更大的类型转换(保证数据不丢失);
- 转换优先级:
char → short → int → long → long long;int → float → double。
强制类型转换
- 触发场景:主动将数据转换为更小的类型(可能丢失数据,需注意安全性);
- 语法格式:
(目标类型) 数值/变量,例:(int)10.2、(short)32; - 核心特性:仅根据原变量计算出新的类型值,不修改原变量的值和类型;
- 优先级:强制类型转换的优先级高于四则运算;
- 易错示例:
int i = (int)a / b;:先将 a 转为 int,再与 b 做除法;int i = (int)(a / b);:先计算 a/b,再将结果转为 int;double d = (double)(a / b);:a、b 为 int 时,先做整数除法再转 double,需先转其中一个为 double。
七、布尔类型(bool)
- C 语言本身无原生 bool 类型,需引入头文件
#include<stdbool.h>; - 引入后可使用
bool定义布尔变量,取值为true(真,对应 1)和false(假,对应 0)。
八、逻辑运算
逻辑运算的操作数为逻辑量(关系运算 / 逻辑运算的结果),结果仅为0(假)或1(真)。
基本逻辑运算符
表格
| 运算符 | 名称 | 描述 | 示例 | 结果规则 |
|---|---|---|---|---|
| ! | 逻辑非 | 取反 | !a | a 为真则结果为假,反之则真 |
| && | 逻辑与 | 并且 | a&&b | 两者均为真则真,否则为假 |
| || | 逻辑或 | 或者 | a||b | 两者其一为真则真,均假则假 |
区间表达式的正确写法
数学中的区间(如4<x<6、4≤x≤6)不能直接写为 C 语言表达式,因4<x的结果是 0/1,再与 6 比较会出错。正确写法:用逻辑与连接多个关系表达式,例:
x>4 && x<6(对应x∈(4,6))x>=4 && x<=6(对应x∈[4,6])
逻辑运算的优先级
优先级从高到低:! > && > \|\|,可通过括号改变运算顺序,例:!done && (count>MAX)。
短路特性
逻辑运算自左向右执行,如果左边的结果已能确定最终结果,右边的表达式不会执行(短路),例:
a==6 && b==1:若a==6为假,直接返回假,不计算b==1;a==6 && b+=1:若a==6为假,b+=1不会执行,b 的值不变。
九、运算符优先级与结合性
C 语言运算符的优先级决定运算顺序,结合性决定同优先级运算符的执行方向,核心优先级(从高到低):
- 括号
()(最高) - 单目运算符:
!、+(正)、-(负)、++、--(右结合) - 算术乘除模:
*、/、%(左结合) - 算术加减:
+、-(左结合) - 关系运算符:
>、<、>=、<=(左结合) - 相等运算符:
==、!=(左结合) - 逻辑与:
&&(左结合) - 逻辑或:
\|\|(左结合) - 赋值运算符:
=、+=、-=、*=、/=、%=(右结合,最低)
十、条件运算符
语法格式
C 语言唯一的三目运算符,语法:条件 ? 满足条件的值 : 不满足条件的值;
核心功能
简化简单的双分支判断,等价于基础的 if-else 语句。
示例
count = (count>20) ? count-10 : count+10;含义:若 count>20,count=count-10;否则 count=count+10。
十一、逗号表达式
(注:原文档未补充逗号表达式详细内容,核心基础特性:多个表达式用逗号分隔,从左到右依次执行,整个逗号表达式的结果为最后一个表达式的结果。)示例:a=1, b=2, c=a+b; 执行后 a=1、b=2,表达式结果为 3。
340

被折叠的 条评论
为什么被折叠?



