C语言-006

一、C 语言与编程语言的类型发展

C 之后的编程语言向两个方向分化发展,核心差异体现在类型检查的重视程度:

  1. 强类型方向:C++、Java,强调类型定义,对类型的检查更为严格;
  2. 弱类型方向:JavaScript、Python、PHP,不看重类型,无需事先定义变量类型。

类型安全的争议

  • 支持强类型:明确的类型定义能帮助程序员尽早发现程序中的简单错误
  • 反对强类型:过度强调类型会迫使程序员关注底层实现,而非业务逻辑本身。

类型强调的规律

  1. 早期的编程语言普遍强调类型;
  2. 面向底层开发的编程语言会强调类型;
  3. C 语言要求变量定义类型,但对类型的安全检查并不足够

二、sizeof 运算符

  1. 核心功能:作为运算符,返回某个类型或变量在内存中占据的字节数,语法:sizeof(int)sizeof(i)
  2. 关键特性静态运算符,计算结果在编译时刻就已确定;
  3. 使用注意:不要在 sizeof 的括号内执行运算,括号内的运算不会被实际执行。

三、整数类型

基本整数类型及字节数

表格

类型字节数说明
char1 字节(8 位)既是整数类型也是字符类型
short2 字节短整型
int取决于编译器 / CPU通常表示 “1 个字”
long取决于编译器 / CPU通常表示 “1 个字”
long long8 字节长整型

整数的二进制表达

计算机内部所有整数均以二进制存储,正数直接存储二进制原码,负数通过补码存储,0 的二进制为00000000(1 字节为例)。

二进制负数的表示方案

1 字节的二进制范围为00000000 - 11111111,表示负数有三种方案,C 语言采用补码方案

  1. 仿照十进制,设置特殊标志位表示负数;
  2. 取中间值为 0,小于该值为负、大于为正;
  3. 补码:满足负数 + 其绝对值 = 0的二进制规则(超出位数直接舍弃)。

补码的核心逻辑

以 1 字节的-1为例,希望-1 + 1 = 0

  • 1 的二进制:00000001
  • -1 的补码:11111111
  • 计算:11111111 + 00000001 = 100000000,舍弃超出 1 字节的最高位,结果为00000000(即 0)。

1 字节整数的数值范围(补码)

表格

二进制范围对应十进制类型
000000000
00000001~011111111~127正数
10000000~11111111-128~-1负数

整数的输入输出格式符

仅区分intlong long,无符号类型需对应专用格式符:

表格

类型输入输出格式符
int%d
unsigned int%u
long long%ld
unsigned long long%lu

8 进制与 16 进制

  1. 16 进制:4 位二进制对应 1 位 16 进制,适合表达二进制数据;
  2. 8 进制:1 位 8 进制对应 3 位二进制,因早期计算机字长为 12 的倍数(非 8)而设计。

整数类型的选择原则

  1. 设计底层程序时,为精准操作内存选择对应类型;
  2. 无特殊需求时,优先选择 int:现代 CPU 字长多为 32/64 位,一次内存读写 / 计算的单位为 int,更短类型不会更快甚至更慢;
  3. 内存对齐:现代编译器会做内存对齐优化,短类型实际占用内存可能与 int 一致(sizeof仍返回实际字节数);
  4. unsigned仅影响输出形式,变量内部的计算逻辑无差异。

四、浮点类型

基本浮点类型及特性

C 语言主要浮点类型为floatdouble,核心参数如下:

表格

类型字长(位)数值范围有效数字特殊值
float32±(1.20×10⁻³⁸ ~ 3.40×10³⁸)7 位0、±inf、nan
double64±(2.2×10⁻³⁰⁸ ~ 1.79×10³⁰⁸)15 位0、±inf、nan

浮点类型的输入输出格式符

floatdouble的输入格式符有差异,输出可通用%f/%e(科学计数法):

表格

类型输入格式符输出格式符
float%f%f、%e
double%lf%f、%e

科学计数法的书写规则

  1. eE表示指数,例:-5.67E+16
  2. 指数前可加+/-,省略则表示正;
  3. 小数点可选,整个表达式无空格

浮点运算的精度问题

  1. 程序中带小数点的字面量默认是 double 类型,定义 float 变量需加后缀f/F,例:float a = 1.345f;
  2. 浮点运算存在精度误差,禁止直接用==判断两个浮点值是否相等

浮点数的内部表达

  1. 符号位、指数位、尾数位组成(double 为例:1 位符号 + 11 位指数 + 52 位尾数);
  2. 浮点计算由 CPU 专用硬件部件实现,floatdouble使用相同计算部件。

浮点类型的选择原则

无特殊需求时优先选择 double:现代 CPU 可直接对 double 做硬件运算,性能与 float 无差异;64 位机器中,double 的存储速度也不慢于 float。

五、字符类型(char)

char 是特殊的整数类型,同时用于表示字符,核心特性:

  1. 字面量:用单引号包裹,例:'a''1''"'
  2. 输入输出:格式符为%c
  3. ASCII 编码:字符在内存中以 ASCII 码(整数)存储,例:'1'的 ASCII 码是 49,char c=49等价于char c='1'

大小写字母转换

  1. 字母在 ASCII 表中连续顺序排列,但大写和小写字母分开存储;
  2. 转换公式:利用'a'-'A'获取大小写的编码差值(固定为 32)
    • 大写转小写:字符 + ('a'-'A')
    • 小写转大写:字符 + ('A'-'a')

转义字符(逃逸字符)

用于表示无法直接打印的控制字符 / 特殊字符,以 ** 反斜杠 ** 开头,与后续字符组成一个字符,常用转义字符:

表格

转义字符意义转义字符意义
\b回退一格"双引号
\t制表位(Tab)'单引号
\n换行\反斜杠本身
\r回车--

使用示例printf("如输入\"57\"表示5英尺7英寸:");

六、类型转换

C 语言的类型转换分为自动类型转换强制类型转换,核心原则为避免数据丢失

自动类型转换

  1. 触发条件:运算符两边的操作数类型不一致;
  2. 转换规则:向表达范围更大的类型转换(保证数据不丢失);
  3. 转换优先级:char → short → int → long → long longint → float → double

强制类型转换

  1. 触发场景:主动将数据转换为更小的类型(可能丢失数据,需注意安全性);
  2. 语法格式:(目标类型) 数值/变量,例:(int)10.2(short)32
  3. 核心特性:仅根据原变量计算出新的类型值不修改原变量的值和类型
  4. 优先级:强制类型转换的优先级高于四则运算
  5. 易错示例
    • 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)

  1. C 语言本身无原生 bool 类型,需引入头文件#include<stdbool.h>
  2. 引入后可使用bool定义布尔变量,取值为true(真,对应 1)和false(假,对应 0)。

八、逻辑运算

逻辑运算的操作数为逻辑量(关系运算 / 逻辑运算的结果),结果仅为0(假)或1(真)。

基本逻辑运算符

表格

运算符名称描述示例结果规则
!逻辑非取反!aa 为真则结果为假,反之则真
&&逻辑与并且a&&b两者均为真则真,否则为假
||逻辑或或者a||b两者其一为真则真,均假则假

区间表达式的正确写法

数学中的区间(如4<x<64≤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)

短路特性

逻辑运算自左向右执行,如果左边的结果已能确定最终结果,右边的表达式不会执行(短路),例:

  1. a==6 && b==1:若a==6为假,直接返回假,不计算b==1
  2. a==6 && b+=1:若a==6为假,b+=1不会执行,b 的值不变。

九、运算符优先级与结合性

C 语言运算符的优先级决定运算顺序,结合性决定同优先级运算符的执行方向,核心优先级(从高到低):

  1. 括号()(最高)
  2. 单目运算符:!+(正)、-(负)、++--右结合
  3. 算术乘除模:*/%(左结合)
  4. 算术加减:+-(左结合)
  5. 关系运算符:><>=<=(左结合)
  6. 相等运算符:==!=(左结合)
  7. 逻辑与:&&(左结合)
  8. 逻辑或:\|\|(左结合)
  9. 赋值运算符:=+=-=*=/=%=右结合,最低)

十、条件运算符

语法格式

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值