【零基础C语言】第二节 数据类型、运算符、表达式
涉及数制、进制、码制相关知识点:
【零基础C语言】第一节 C语言概述+【数制进制码制】-CSDN博客
目录
一、C语言词汇
1.1 标识符(考点)
1.2 关键字
(1)sizeof() ☆考点
(2)typedef() ☆考点
1.3 运算符
☆运算符优先级
二、常量和变量
2.1 常量
2.1.1 字面常量
(1)整型常量
(2)浮点型常量
(3) 字符型常量
2.1.2 符号常量
(1)宏常量
(2)const常量
2.2 变量
(1)变量的定义/声明
(2)变量的赋值
三、数据类型
字符类型
3.1 变量的类型决定了什么?
3.2 占用内存空间的大小
3.3 不同数据类型的表示范围
3.4 可参与的运算
3.5 字节存储顺序
3.6 计算机存储的 +1 和 -1?
四、表达式
(1)强制类型转换表达式
(2)赋值表达式
(3)运算表达式(自增自减)
一、C语言词汇
1.1 标识符(考点)
即程序中使用的变量名、函数名等
- 只能包含 字母(Aa~Zz)、数字(0-9)、下划线(_) 简洁有意义
 - 只能字母和下划线开头
 - 大小写敏感:C语言区分大小写,字母大写和小写是不同的变量名
 - 避免使用保留字:不能使用C语言的关键字和保留字作为变量名
 
 1.2 关键字

(1)sizeof() ☆考点
- sizeof(类型):类型占用的内存字节数
 - sizeof(变量或表达式):变量或表达式所属类型所占的内存字节数
 
增加程序的可执行性
编译时执行的运算符,不会导致额外的运行时间开销
(2)typedef() ☆考点
typedef:为现有数据类型创建一个新的名字。typedef 数据类型 别名
1.3 运算符
- 算术运算符(7个):+、-、*、/、%、++、--
 - 关系运算符(6个):>、<、>= 、<=、==、!=
 - 逻辑运算符(3个):&&、||、 !
 - 赋值运算符(1个):=
 - 位运算符(6个):<<(向左移位)、>>(向右移位)、~(取反)、 |(按位或)、^(按位异或)、&(按位与)
 
| a=3;a<<4; | 00000011(十进制3) 向左移4位 00110000(48) | 
| a=15;a>>2; | 00001111(十进制15) 向右移2位 00000011(3) | 
| ~9; | 0000000000001001(十进制9)取反1111111111110110 | 
| 9|5=13; | 两数对应的二进制位执行或运算,一真为真,双假为假 | 
| 9^5=12; | 两数对应的二进制位相异或,值相同为0,相反为1 | 
| 9&5=1; | 两数对应的二进制位执行与运算,双真为真,一假为假 | 
☆运算符优先级
运算符分为单目(一元),双目(二元)和三目(三元)。顾名思义,目,即运算符操作数的个数
| 类型 | 说明 | 举例 | 
|---|---|---|
| 单目 | 操作数只有一个,从右向左 | a++(a自增1) | 
| 双目 | 操作数有两个,从左向右 | a + b(两数之和) | 
| 三目 | 目前仅有条件运算符 | a ? b : c(如果a为真,结果为b,否则为c | 

| 优先级 | 运算符 | 名称或含义 | 使用形式 | 说明 | 方向 | 
| 1 | [] | 数组下标 | 数组名[常量表达式] | ---- | 左到右 | 
| () | 圆括号 | (表达式) | |||
| 函数名(形参表) | |||||
| . | 成员选择(对象) | 对象.成员名 | |||
| -> | 成员选择(指针) | 对象指针->成员名 | |||
| 2 | - | 负号运算符 | -表达式 | 单目 | 右到左 | 
| (类型) | 强制类型转换 |   (类型名)表达式  | |||
| ++ | 自增 | 单目 | |||
| -- | 自减 | --变量名 | |||
| 变量名-- | |||||
| * | 取值 | *指针变量 | |||
| & | 取地址运算符 | &变量名 | |||
| ! | 逻辑非 | !表达式 | |||
| ~ | 按位取反运算符 | ~表达式 | |||
| sizeof | 长度运算符 | sizeof(表达式) | |||
| 3 | / | 除 | 得到的整数部分 | 双目 | 左到右 | 
| * | 乘 | 表达式*表达式 | |||
| % | 求余(取模) | 必须是整型,整除后的余数 | |||
| 4 | + | 加 | 表达式+表达式 | ||
| - | 减 | 表达式-表达式 | |||
| 5 | << | 左移 | 变量<<表达式 | ||
| >> | 右移 | 变量>>表达式 | |||
| 6 | > | 大于 | 表达式>表达式 | ||
| >= | 大于等于 | 表达式>=表达式 | |||
| < | 小于 | 表达式<表达式 | |||
| <= | 小于等于 | 表达式<=表达式 | |||
| 7 | == | 等于 | 判断是否相等 | ||
| != | 不等于 | 判断是否不等 | |||
| 8 | & | 按位与 | 表达式&表达式 | ||
| 9 | ^ | 按位异或 | 表达式^表达式 | ||
| 10 | | | 按位或 | 表达式|表达式 | ||
| 11 | && | 逻辑与A | A和B | ||
| 12 | || | 逻辑或 | A或B | ||
| 13 | ?: | 条件运算符 | 表达式1? 表达式2: 表达式3 | 三目 | 右到左 | 
| 14 | = | 赋值 | 变量=表达式 | --------- | 右到左 | 
| /= | 除后赋值 | 变量/=表达式 | |||
| *= | 乘后赋值 | 变量*=表达式 | |||
| %= | 取模后赋值 | 变量%=表达式 | |||
| += | 加后赋值 | 变量+=表达式 | |||
| -= | 减后赋值 | 变量-=表达式 | |||
| <<= | 左移后赋值 | 变量<<=表达式 | |||
| >>= | 右移后赋值 | 变量>>=表达式 | |||
| &= | 按位与后赋值 | 变量&=表达式 | |||
| ^= | 按位异或后赋值 | 变量^=表达式 | |||
| |= | 按位或后赋值 | 变量|=表达式 | |||
| 15 | , | 逗号运算符 | 表达式,表达式,… | 左到右 | 
二、常量和变量
程序执行过程中,取值不发生改变的量是常量,取值可变的是变量
2.1 常量
2.1.1 字面常量
(1)整型常量
| 整形常量 | 前缀 | 合法示例 | 
|---|---|---|
| 八进制整常数 | 0 | 0,016,0101 | 
| 十六进制整常数 | 0x 或 0X | 0x1A,0XFFFF | 
| 十进制整常数 | 无前缀 | 123,456,7890 | 
(2)浮点型常量
| 实型常量 | 描述 | 合法示例 | 
|---|---|---|
| 十进制小数形式 | 由数字 0~9 和小数点组成。 | 0.0,-2.87,.5,1,3.14 | 
| 指数形式 | 由十进制数、e 或 E 以及指数组成。 | 1.5e10,-2.5E-3,6.02e23 | 
| 类型 | 存储大小 | 值范围 | 精度 | 
|---|---|---|---|
| float | 4 字节 | -3.4E-38 到 3.4E+38 | 6 位小数 | 
| double | 8 字节 | -1.7E-308 到 1.7E+308 | 15 位小数 | 
| long double | 16 字节 | -1.1E-4932 到 1.1E+4932 | 19 位小数 | 
(3)字符型常量
- 由单引号括起来的一个字符 如'x','y'等都是合法的字符。
 - 以反斜杠\开头的字符序列,被称为“转义”字符
 
| 字符表示 | 功能 | 
|---|---|
\n | 换行 | 
\t | 横向跳到下一制表位置 | 
\" | 双引号 | 
\' | 单引号 | 
\\ | 反斜线 | 
\ddd | 1-3 位八进制数所代表的字符 (ASCII) | 
\xhhh | 1-2 位十六进制数所代表的字符 (ASCII) | 
2.1.2 符号常量
(1)宏常量
- 使用标识符,在使用前需要先定义
 - 慎用符号(考虑要不要分号)
 - 预编译阶段发生替换:处理“程序中的编译预处理命令” 的结果 + 源程序 ——>编译得到目标代码
 
定义方法:#define 标识符 字符串
缺点:
- 没有数据类型,编译器在进行宏替换时不进行类型检查
 - 只进行简单的字符串替换,极易产生意想不到的缺点
 
(2)const常量
- 有数据类型,进行类型检查
 - 某些集成化调试工具可以对其进行调试
 

2.2 变量
(1)变量的定义/声明
变量使用之前必须先声明变量,只有一次
int main() {int a;int b,c;     //定义变量} 
(2)变量的赋值
变量使用之前一定要赋值
变量使用“=”赋值,等号左侧为左值,等号右侧为右值
int main(){int a,b;char ch;a=3,b=4;ch= 'c';
} 
int main(){int a = 3,b =4;  char ch ='c';  //初始化double d = 3.14, e = 2.58;   //定义变量并初始化ch = 'd';      //赋值:变量已存在(对应空间已开辟),将字符d直接放到一个已经存在的空间中} 
三、数据类型

字符类型

3.1 变量的类型决定了什么?
地址:每个变量都分配了一个内存地址
- 使用&(地址运算符)获取变量的内存地址
 - 通过指针访问和操作变量的内存地址
 
32位机的内存地址是32位,从0x00000000到0xFFFFFFFF
编译器按照变量定义的类型分配相应大小的内存空间
3.2 占用内存空间的大小

如:unsigned类型 VS 有符号类型;整数型VS 浮点数;字符型 VS 整型
3.3 不同数据类型的表示范围
与解释方式和长度有关
float大概能表达6-7位小数

char ——> 1字节 ——>8位——> 有1个符号位
unsigned char ——> 1字节 ——>8位——>没有符号位
3.4 可参与的运算
整型 :加减乘除余
浮点型:加减乘除
字符型:加减 (ASCII码)
3.5 字节存储顺序
主要分为大端序(Big-endian)和小端序(Little-endian),区别如下
| 类型 | 解释 | 备注 | 
|---|---|---|
| Big-endian | 高位字节存入低地址,低位字节存入高地址 | 与从左到右的书写顺序相同,便于处理字符串 | 
| Little-endian | 低位字节存入低地址,高位字节存入高地址 | 便于计算机从低位字节向高位字节运算 | 
3.6 计算机存储的 +1 和 -1?
计算机中所有的数据都是采用补码存放的。
符号位 0 为正、1 为负
正整数 —— 源码存储,最高位为 0(正) ,正数:原码 =补码负整数—— 补码存储,最高位为 1 (负),负数:补码=原码符号位不变,其余各位取反,在+1

四、表达式
表达式 = 运算符 + 运算对象
运算结果取决于占内存大的运算对象的数据类型
----------------回看运算符优先级部分↑-----------------
(1)强制类型转换表达式
2种类型转换:
- 一种是自动,在运算时不需要用户指定,系统自动进行的类型转换,如3+6.5
 - 一种就是强制,当自动不能实现目的时,可以用强制
 
int b =7;    float a = 2.5,c = 4.7;a + (int)(b/3 *(int)(a+c)/2.0)%4 
=2.5 +(int)(2 * 7/2.0)%4
=2.5 + 7 %4 
= 2.5+3 
= 5.5 
(2)赋值表达式

(3)运算表达式(自增自减)
|   int m =1; n = ++m;  |   m先自增1,再赋值给n,所以n=2  | 
|   int m = 1; n = m++;  |   m先赋值给n,m再自增1,所以n=1  | 
----------------回看运算符优先级部分↑------------------
五、附:标准 ASCII 码对照表
| ASCII 值 | 控制字符 | ASCII 值 | 字符 | ASCII 值 | 字符 | ASCII 值 | 字符 | 
|---|---|---|---|---|---|---|---|
| 0 | NUL | 32 | (space) | 64 | @ | 96 | 、 | 
| 1 | SOH | 33 | ! | 65 | A | 97 | a | 
| 2 | STX | 34 | " | 66 | B | 98 | b | 
| 3 | ETX | 35 | # | 67 | C | 99 | c | 
| 4 | EOT | 36 | $ | 68 | D | 100 | d | 
| 5 | ENQ | 37 | % | 69 | E | 101 | e | 
| 6 | ACK | 38 | & | 70 | F | 102 | f | 
| 7 | BEL | 39 | ' | 71 | G | 103 | g | 
| 8 | BS | 40 | ( | 72 | H | 104 | h | 
| 9 | HT | 41 | ) | 73 | I | 105 | i | 
| 10 | LF | 42 | * | 74 | J | 106 | j | 
| 11 | VT | 43 | + | 75 | K | 107 | k | 
| 12 | FF | 44 | , | 76 | L | 108 | l | 
| 13 | CR | 45 | - | 77 | M | 109 | m | 
| 14 | SO | 46 | . | 78 | N | 110 | n | 
| 15 | SI | 47 | / | 79 | O | 111 | o | 
| 16 | DLE | 48 | 0 | 80 | P | 112 | p | 
| 17 | DCI | 49 | 1 | 81 | Q | 113 | q | 
| 18 | DC2 | 50 | 2 | 82 | R | 114 | r | 
| 19 | DC3 | 51 | 3 | 83 | S | 115 | s | 
| 20 | DC4 | 52 | 4 | 84 | T | 116 | t | 
| 21 | NAK | 53 | 5 | 85 | U | 117 | u | 
| 22 | SYN | 54 | 6 | 86 | V | 118 | v | 
| 23 | TB | 55 | 7 | 87 | W | 119 | w | 
| 24 | CAN | 56 | 8 | 88 | X | 120 | x | 
| 25 | EM | 57 | 9 | 89 | Y | 121 | y | 
| 26 | SUB | 58 | : | 90 | Z | 122 | z | 
| 27 | ESC | 59 | ; | 91 | [ | 123 | { | 
| 28 | FS | 60 | < | 92 | \ | 124 | |
| 29 | GS | 61 | = | 93 | ] | 125 | } | 
| 30 | RS | 62 | > | 94 | ^ | 126 | ` | 
| 31 | US | 63 | ? | 95 | _ | 127 | DEL | 
