- 简单赋值运算符
赋值符号 = 就是赋值运算符,它的作用是将一个数据赋值给一个变量
- 复合赋值运算符
在赋值运算符之前加上算术运算符或者位运算符,可以构成复合赋值运算符
运算符的优先级及结合性与简单赋值运算符相同
复合赋值运算符构成的表达式在计算时,先把左边变量的值与右边整个表达式的值进行相应的计算,然后把运算的结果赋值给左边的变量,整个复合赋值表达式的值也是左边变量的值
作用:
简化程序,使程序精炼提高编译效率,产生质量较高的目标代码
- 赋值表达式
由赋值运算符将一个变量和一个表达式连接起来的式子。对赋值表达式求解的过程:先求赋值运算符右侧的”表达式“的值,然后赋值给赋值运算符左侧的变量
赋值运算符左侧必须是一个变量,而不能是常量或表达式赋值运算符右侧的"表达式"可以是常量、变量或者表达式赋值运算符右侧的"表达式"也可以是一个赋值表达式赋值表达式也可以包含复合赋值运算符
- 赋值过程中的类型转换
如果赋值运算符两侧的类型一致,则直接进行赋值。如果赋值运算符两侧的类型不一致,但都是算术类型时,在赋值时要进行类型转换。类型转换是由系统自动进行的
| 不同类型数据的赋值转换规则 | ||
|---|---|---|
| 变量类型 | 表达式类型 | 转换规则 |
| char | int | 取表达式值的低8位内容 |
| short | int | 取表达式值的低16位内容 |
| char | float、double | 取表达式整数部分的低8位 |
| int | float、double | 舍弃小数部分 |
| int | char | 将对应的ASCII码值赋值给变量 |
| float、double | int | 数值不变,但将以浮点形式存放 |
| float | double | 取7位有效数字 |
| double | float | 数值不变,在内存中以8个字节存储,有效数字位数扩展到16位 |
将一个占字节多的整型数据赋给一个占字节少的整型变量或字符变量将浮点数(包括单、双精度)数据赋给字符型变量时,先对浮点数取整,即舍弃小数部分,然后取整数部分的低8位赋给整型变量将浮点型(包括单、双精度)数据赋给整型变量时,先对浮点数取整,即舍弃小数部分,然后赋给整型变量将字符型数据赋给整型变量时,将字符的ASCII代码赋给整型变量将整型数据赋给单、双精度变量时,数值不变,但以浮点数形式存储到变量中将一个double型数据赋给float变量时,先将双精度数转换为单精度,即只取7位有效数字,存储到float变量的4个字节中将一个float型数据赋给double变量时,数值不变,在内存中以8个字节存储,有效数字位数扩展到16位
- 变量赋初值
一般变量初始化不是在编译阶段完成的(只有静态存储变量和外部变量的初始化是在编译阶段完成的),而是在程序运行中执行本函数时赋予初值的带,相当于执行一个赋值语句
3. 关系运算符和关系表达式所谓"关系运算"就是"比较运算",将两个数值进行比较,判断其比较结果是否符合给定的条件
- 关系运算符及其优先次序
C语言中有六种关系运算符,分别为 >(大于)、<(小于)、>=(大于等于)、<=(小于等于)、==(等于)、!=(不等于)
注意:
前4种关系运算符>、<、>=、<=优先级别相同,后2种关系运算符==、!=优先级别也相同,并且前4种运算符优先级高于后2种关系运算符的优先级低于算术运算符关系运算符的优先级高于赋值运算符
- 关系表达式
用关系运算符将两个数值或数值表达式连接起来的式子。
4. 逻辑运算符和逻辑表达式- 逻辑运算符及其优先次序
有三种逻辑运算符:与(AND)、或(OR)、非(NOT)
| 逻辑运算符及其含义 | ||
|---|---|---|
| 运算符 | 含义 | 说明 |
| && | 逻辑与 | 如果运算符两边都为真,则结果为真。只要有一个为假,则结果为假 |
| || | 逻辑或 | 如果运算符两边有一个为真,则结果为真。两边都为假,则结果为假 |
| ! | 逻辑非 | 如果运算对象为真,则结果为假。如果运算对象为假,则结果为真 |
"&&“和”||“是双目运算符,它有两个运算对象(操作数)。”!"是单目运算符,只有一个运算对象。
优先级次序:
逻辑非(!)高于逻辑与(&&),逻辑与(&&)高于逻辑非(||)逻辑运算符种的"&&“和”||“低于关系运算符,”!"高于算术运算符
- 逻辑表达式
C语言编译系统在表示逻辑运算结果时,以数值1代表逻辑"真",以0代表逻辑"假",但在判断一个量是否为"真"时,以非0代表"真"。即将一个非0数值认为"真",将0认为"假"。
逻辑运算符两侧的运算对象不但可以是0和1,或者是0或非0的整数,也可以是字符型、浮点型、枚举型或指针型数据。系统最终以0和非0来判断属于"真"或"假"。
在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求解表达式的解时,才执行该运算符。
5. 条件运算符和条件表达式条件运算符由两个符号(?和:)组成,必须一起使用。要求有3个操作对象,称为三目运算符,它是C语言中唯一一个三目运算符。
说明:
条件运算符的执行顺序:先求解表达式1,若为非0(真)则求解表达式2,此时表达式2的值就作为整个条件表达式的值。若表达式1的值为0(假),则求解表达式3的值,表达式3的值就是整个条件表达式的值条件运算符优先级高于赋值运算符,因此赋值表达式的求解过程是先求解条件表达式,再将条件表达式的值赋值给赋值运算符的左值条件运算符的优先级比关系运算符和算术运算符都低
注: 双目运算符分为左值和右值,其中左值是可以被赋值的值,相当于地址值。右值不可以被赋值,相当于数据值
6. 逗号运算符和逗号表达式- 逗号运算符
逗号运算符的功能是将两个及以上的表达式连接起来。
逗号运算符的优先级是所有运算符中最低的,其结合性为"从左到右"
- 逗号表达式
表达式1,表达式2,表达式3,······,表达式n
求解顺序:从左到右依次求解各个表达式,最后一个表达式的值为整个逗号表达式的值
7. 位运算符- 位运算符
位运算符的操作数只能是整形数据或字符型数据,字符型数据以其ASCII码值参加运算。位运算把运算对象看作是二进制位组成的位串信息,按位完成指定的运算,得到位串信息的结果
| 位运算符及其意义 | |||
|---|---|---|---|
| 运算符 | 含义 | 举例 | 说明 |
| & | 按位逻辑与 | a&b | 将两个操作数a、b的二进制补码按相应位运算,两个相应位均为1,则结果该位为1,否则该位为0 |
| | | 按位逻辑或 | a|b | 将两个操作数a、b的二进制补码按相应位运算,两个相应位均为0,则结果该位为0,否则该位为1 |
| ^ | 按位异或 | a^b | 将两个操作数a、b的二进制补码按相应位运算,两个相应位相同则该位为0,不同该位为1 |
| ~ | 按位取反 | ~a | 将操作数a的二进制补码按相应位运算,为0的位,取反后为1,为1的位,取反后为0 |
| << | 左移 | A< | |
- 位运算符的优先级
6种位运算符的优先级从高到低的次序依次是:~、<<和>>、&、^、|,其中<<和>>优先级相同;~运算符的结合为自右向左,其余运算符的结合方向均为自左向右
- 位运算符的一些特殊用途
按位"逻辑与"运算符的一些特殊用途
- 使特定位清零取指定位的值若想百六某一位,就与一个数进行位运算,此数在该位取1,其他位取0
按位"逻辑或"运算符的一些特殊用途
- 使特定位置为1使特定位保留原值
按位"异或"运算符的一些特殊用途
- 使特定位"取反"与0按位异或,保留原值交换两个值,不用临时变量
- sizeof
sizeof是C语言的一种单目运算符,它并不是函数
sizeof运算符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式括在括号内的类型名,操作数的存储大小由操作数的类型决定
sizeof的使用方法
- 用于数据类型。数据类型必须用括号括住用于变量。变量名可以不用括号括住(不推荐)
sizeof与其他操作符的关系
sizeof的优先级为第2级,比/、%等3级运算符的优先级高。它可以与其他操作符一起组成表达式
sizeof的主要用途
- sizeof运算符的一个主要用途是与存储分配和I/O系统那样的例程进行同通信sizeof运算符的另一个主要用途是计算数组中元素的个数



