运算符与表达式
C语言中的运算符
C语言中的运算符 | ||||
---|---|---|---|---|
优先级 | 运算符 | 含义 | 运算对象个数 | 结合方向 |
1 | () | 圆括号 | 自左至右 | |
[] | 下标运算符 | |||
-> | 指向结构体成员运算符 | |||
· | 结构体成员运算符 | |||
2 | ! | 逻辑非运算符 | 单目运算符 | 自右至左 |
~ | 按位取反运算符 | |||
++ | 自增运算符 | |||
-- | 自减运算符 | |||
- | 负号运算符 | |||
(类型) | 类型转换运算符 | |||
* | 指针运算符 | |||
& | 取地址运算符 | |||
sizeof | 求字节长度运算符 | |||
3 | * | 乘法运算符 | 双目运算符 | 自左至右 |
/ | 除法运算符 | |||
% | 求余运算符 | |||
4 | + | 加法运算符 | 双目运算符 | 自左至右 |
- | 减法运算符 | |||
5 | << | 左移运算符 | 双目运算符 | 自左至右 |
>> | 右移运算符 | |||
6 | <、<=、>、>= | 关系运算符 | 双目运算符 | 自左至右 |
7 | == | 等于运算符 | 双目运算符 | 自左至右 |
!= | 不等于运算符 | |||
8 | & | 按位与运算符 | 双目运算符 | 自左至右 |
9 | ^ | 按位异或运算符 | 双目运算符 | 自左至右 |
10 | | | 按位或运算符 | 双目运算符 | 自左至右 |
11 | && | 逻辑与运算符 | 双目运算符 | 自左至右 |
12 | || | 逻辑或运算符 | 双目运算符 | 自左至右 |
13 | ?: | 条件运算符 | 三目运算符 | 自右至左 |
14 | = | 赋值运算符 | 双目运算符 | 自右至左 |
+= | ||||
-= | ||||
*= | ||||
/= | ||||
%= | ||||
>>= | ||||
<<= | ||||
&= | ||||
^= | ||||
|= | ||||
15 | , | 自左至右 |
- 表中的运算符的优先级由上向下依次递减,同一行的运算符具有相同的优先级
- 同一优先级的运算符,运算顺序由结合方向决定。所有的单目运算符、条件运算符、赋值运算符的结合方向是自右向左,其余运算符的结合方向是自左向右
- 不同的运算符要求有不同的运算对象个数
- 初等运算符 > 单目运算符 > 算术运算符(先乘除求余,后加减) > 关系运算符 > 逻辑运算符(不包括!) > 条件运算符 > 赋值运算符 > 逗号运算符
- 位运算符的优先级比较分散,有的在算术运算符之前,有的在关系运算符之前,有的在关系运算符之后
- 初等运算符包括圆括号、下标运算符、结构体成员运算符、指向结构体成员运算符
1. 算术运算符和算术表达式
- 基本的算术运算符
+、-、*、/、%
注:
由于键盘上面没有 X 号,运算符 X 用 * 代替
由于键盘上没有除号,运算符除号用 / 代替。两个实数相除的结果是双精度实数,两个整数相除的结果是整数
% 运算符要求参加运算的两个运算对象都为整数,结果也是整数
除 % 以外的算术运算符的操作数都可以是任何算术类型、
- 自增、自减运算符
作用:自增运算符 ++ 使运算变量的值加一,自减运算符 – 使运算变量的值减一
它们均是单目运算符。运算对象可以是整型或实型变量,但不可以是常量和表达式
- 算术表达式
用算术运算符和括号将运算对象连接起来的、符合C语言运发规则的式子。运算对象包括常量、变量、函数等
算术表达式的说明
- 在表达式中可以使用多层圆括号,但左、右括号必须配对。运算时从内层开始,由内向外依次计算表达式的值。
- 在求解表达式的值时,若包含不同优先级的运算符,则按运算符的优先级由高到低运算,若表达式中运算符的级别相同,则按运算符的结合方向进行
-
算术运算中的类型转换
-
自动转换
如果一个运算符两侧的数据类型不同,则先自动进行类型转换,使二者具有同一种类型,然后进行运算。因此整型、实型、字符型数据间可以进行混合运算
不同类型的数据进行混合运算时,转换规律如下:
- +、/、*、/运算的两个数中有一个数为float或double型,结果是double型,因为系统将所有float型数据都先转换为double型,然后进行运算
- 如果int型与float或double型数据进行运算,先把int型和float型数据转换为double型,然后进行运算,结果都是double型
- 字符型数据与整型数据进行运算,就是把字符的 ASCII 代码与整型数据进行运算。字符数据可以直接与整型数据进行运算。如果字符型数据与实型数据进行运算,则将字符的 ASCII 代码直接转换为double型数据,然后进行运算
- 强制类型转换
可以利用强制类型转换运算符将一个表达式转换成所需类型
注意:
- 类型名上的括号不能缺少,表达式也应该用括号括起来
- 在强制类型转换时,得到一个所需类型的中间数据,而原来变量的类型并未发生变化
- 当自动类型抓换不能实现目的时,可以用强制类型转换