运算符
运算符分类
- 按照功能分类
- 算术运算符
- 关系运算符和逻辑运算符
- 按位运算符
- 运算符根据参与运算的操作数的个数分为
- 单目运算
- 单目运算:只有一个操作数
- 双目运算
- 双目运算:两个操作数
- 三目运算
- 三目运算:C语言中唯一的一个,也称为问好表达式
- 单目运算
运算符的优先级以及结合性
- C语言中,
运算符的运算优先级分为15级,1级最高,15级最低,在表达式中,优先级高的先于优先级低的进行运算,而在一个运算量两侧的运算符,优先级相同时,则按照运算符的结合性所规定的结合方向处理
优先级 | 运算符 | 名称或含义 | 使用形式 | 结合方向 | 说明 |
---|---|---|---|---|---|
1 | [] | 数组下标 | 数组名[常量表达式] | 左到右 | |
() | 圆括号 | (表达式)/函数名(形参) | |||
. | 成员选择(对象) | 对象.成员 | |||
-> | 成员选择(指针) | 对象指针->成员名 | |||
2 | - | 负号运算符 | -表达式 | 右到左 | 单目运算符 |
(类型) | 强制类型转换 | (数据类型)表达式 | |||
++ | 自增运算符 | ++变量名/变量名++ | 单目运算符 | ||
-- | 自减运算符 | --变量名/变量名-- | 单目运算符 | ||
* | 取值运算符 | *指针变量 | 单目运算符 | ||
& | 取地址运算符 | &变量名 | 单目运算符 | ||
! | 逻辑非运算符 | !表达式 | 单目运算符 | ||
~ | 按位取反运算符 | ~表达式 | 单目运算符 | ||
sizeof | 长度运算符 | sizeof(表达式) | 单目运算符 | ||
3 | / | 除 | 表达式/表达式 | 左到右 | 双目运算符 |
* | 乘 | 表达式*表达式 | 双目运算符 | ||
% | 取余(取模) | 整型表达式%整型表达式 | 双目运算符 | ||
4 | + | 加 | 表达式+表达式 | 左到右 | 双目运算符 |
- | 减 | 表达式-表达式 | 双目运算符 | ||
5 | << | 左移 | 变量<<表达式 | 左到右 | 双目运算符 |
>> | 右移 | 变量>>表达式 | 双目运算符 | ||
6 | > | 大于 | 表达式>表达式 | 左到右 | 双目运算符 |
>= | 大于等于 | 表达式>=表达式 | 双目运算符 | ||
< | 小于 | 表达式<表达式 | 双目运算符 | ||
<= | 小于等于 | 表达式<=表达式 | 双目运算符 | ||
7 | == | 等于 | 表达式==表达式 | 左到右 | 双目运算符 |
!= | 不等于 | 表达式!=表达式 | 左到右 | 双目运算符 | |
8 | & | 按位与 | 表达式&表达式 | 左到右 | 双目运算符 |
9 | ^ | 按位异或 | 表达式^表达式 | 左到右 | 双目运算符 |
10 | 按位或 |
按位或 | 表达式 按位或 表达式 |
左到右 | 双目运算符 |
11 | && | 逻辑与 | 表达式&&表达式 | 左到右 | 双目运算符 |
12 | 或 |
逻辑或 | 表达式 或 表达式 |
左到右 | 双目运算符 |
13 | ?: | 条件运算符 | 表达式1 ? 表达式2:表达式3 | 右到左 | 三目运算符 |
14 | = | 赋值运算符 | 变量=表达式 | 右到左 | |
/= | 除后赋值 | 变量/=表达式 | |||
*= | 乘后赋值 | 变量*=表达式 | |||
%= | 取模后赋值 | 变量$=表达式 | |||
+= | 加后赋值 | 变量+=表达式 | |||
-= | 减后赋值 | 变量-=表达式 | |||
<<= | 左移后赋值 | 变量<<=表达式 | |||
>>= | 右移后赋值 | 变量>>=表达式 | |||
&= | 按位与后赋值 | 变量&=表达式 | |||
^= | 按位异或后赋值 | 变量^=表达式 | |||
按位或后赋值 |
按位或后赋值 | 变量按位或后赋值 表达式 |
|||
15 | , | 逗号运算符 | 表达式,表达式..... | 左到右 | 从左向右顺序运算 |
- 注意:`按位或 | ,逻辑或 | , 按位或后赋值 | = ` |
结合性
- C语言中各种运算符的结合性分为两种,左结合性(自左至右)和右结合性(自右至左)
- 算术运算符的结合性是自左至右,即先左后右
- 自右至左的结合方向称为“右结合性”
算术运算符
算术运算符有:
加+ 减- 乘* 除/ 取余%
整数除以整数,求出来的结果依然是整数
浮点型赋值给整型会损失小数部分
% 两侧必须都为整数
利用%求出来的余数是正数还是负数,由%左边的被除数决定,被除数是正数,余数就是正数,反之则是负数
-
结合性优先级
-* / % 优先级大于 + -- 优先级相同则左结合计算
-
自动类型提升
- 算术运算符规定:只有相同类型的数据才可以进行运算
- 如果计算过程中,参与运算的操作数不是同一类型,那么系统会自动将小类型转换为大类型,然后再进行计算
-
算术运算的注意点:
-
自动类型转换:int a = 10.6
; -
自动将大类型转换为小类型,会丢失精度,自动类型提升 int b = 10.5 + 10
; 将右边的1 提升为double类型,double b = 1.0 / 2 ;解决除法的精度问题
-
强制类型转换 double a = (double)1 / 2; 结果:a=0.500000; double b = (double)(1 / 2);结果:b=0.000000
; 如果取模运算左边小于右边,那么结果就是左边的数
无论是隐式转换还是显式转换,只要将一个大类型的数据,转换为小类型的数据,那么就有可能丢失精度
-
类型转换问题
-
类型转换分为
- 隐式类型转换
- 不同类型数据混合运算时,升级成数据类型较大的类型
- 赋值时右侧表达式的值转换成左侧变量的类型
- 所有浮点运算都是以double类型进行计算,即使表达式中都是float
- 必定会发生的转换
- char、short -> int
- float -> double
- 显式类型转换
- (类型关键字)(表达式)
- (int)8.8 / 4: 8.8先转换为8 然后再除以4,结果是2
- 隐式类型转换
自动转换发生在不同数据类型的量混合运算时,由编译器系统自动完成
-
自动类型转换遵循以下规则:
- 相同的数据类型的值才能进行运算(比如加法运算),而且运算结果依然是同一种数据类型,系统会自动对占用内存较少的类型做一个自动类型提升的操作
- 若参与运算量的类型不同,先转换成同一类型,然后进行运算
- 转换按数据长度增加的方向进行,以保证精度不降低,如int类型和long类型运算时,先把int量转换成long类型再进行计算
- 所有浮点型运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double类型再做运算
- char型和short型参与运算时,必须先转换成int型
- 在赋值运算中,赋值号两边的数据类型不同时,赋值号右边的量将转换为左边的量,如果右边的量的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度,丢失部分,按四舍五入
- char/short -> int ->unsigned -> long -> double
-
强制类型转换:
- 将大范围的数据赋值给小范围的变量时,系统会自动做一个强制类型转换的操作,这样容易丢失精度
- 类型说明符和表达式都必须加括号(单个变量可以不加括号)
赋值运算符
简单赋值运算符:=
复合赋值运算符:+=、-=、*=、/=、%=
最简单的赋值运算:将等号右边的值赋值给等号左边的变量
-
复合赋值运算符
- /= 例如:a/=3; 相当于a = a / 3;
- *= 例如: a*=3; 相当于a = a * 3;
- %= 例如: a%=3; 相当于a = a % 3;
- += 例如: a+=3; 相当于a = a + 3;
- -= 例如: a-=3; 相当于a = a - 3;
自增、自减
- 前缀表达式:++x,--x:其中x表示变量名,先完成变量的自增自减1运算,再用x的值作为表达式的值,即
先变后用
,也就是变量的值先变,然后再用变量的值参与运算 - 后缀表达式:x++,x--:先用x的值为表达式的值,然后变量自增自减1,即
先用后变
,也就是先用变量的值进行运算,然后变量自增自减变换
sizeof运算符
sizeof可以用来计算一个变量或一个常量、一种数据类型所占用的内存字节数
格式:sizeof(变量/常量)
sizeof不是一个函数,是一个运算符
-
计算常量所占用字节数
- sizeof(10); 或者sizeof 10
计算变量占用的字节数
double doubleValue = 10.9;
int number = sizeof(doubleValue);
// 也可以省略括号
int number = sizeof doubleValue;
- 计算数据类型
sizeof计算数据类型,括号不能省略
int number = sizeof(char);
int number = sizeof(double);
逗号运算符
-
功能是将多个表达式连接起来组成一个表达式,称为逗号表达式
- 格式:表达式1,表达式2,.....表达式n;
-
求值过程
- 逗号表达式从左往右以此计算各个表达式的值
- 整个逗号表达式的值是最后一个表达式的值
关系运算符
c语言中,条件成立称为真,条件不成立称为假
任何非0值都是真,只有0才是假
-
关系运算符有:
> 、>= 、< 、<= 、== 、 !=
- 关系运算符的结果只有两种,条件成立结果为真,条件不成立结果为假
关系运算符优先级:
> < >= <= 优先级大于== !=
算术运算符优先级大于关系运算符
逻辑运算符
-
C语言提供了三种逻辑运算符
- && 与
- || 或
- ! 非
-
逻辑与(&&)
- 格式:表达式1 && 表达式2
- 只有表达式1和表达式2都为真的时候才是真,只要有一个是假,那么结果就是假
- 特点:
一假则假,如果表达式1是假,那么表达式2将不会计算
-
逻辑或(||)
- 格式:表达式1 || 表达式2
- 只要有一个是真,那么结果是真,只有两个表达式都为假时,结果才是假
- 特点:
一真则真,如果表达式1是真,那么表达式2将不会计算
-
逻辑非 (!)
- 格式:!表达式
- 表达式是真,那么就是假,表达式是假,那么就是真
- 结合性:
从右至左
三目运算符
- 格式:条件表达式 ? 结果A : 结果B
- 结合性:从左往右
- 条件表达式为真,就返回结果A,否则返回结果B