目录
一、C运算符有哪些?
二、运算符的优先级和使用方式
三、不同类型数据间的混合运算
四、强制类型转换运算符
一、C运算符有哪些?
c语言提供了以下运算符:
| 算术运算符 | +、-、*、/、%、++、- - |
| 关系运算符 | >、<、==、>=、<=、!= |
| 逻辑运算符 | !、&&、|| |
| 位运算符 | <<、>>、~、|、^、& |
| 赋值运算符 | =及其扩展赋值运算符 |
| 条件运算符 | ?: |
| 逗号运算符 | , |
| 指针运算符 | *和& |
| 求字节数运算符 | sizeof |
| 强制类型转换运算符 | (类型) |
| 成员运算符 | . 、-> |
| 下标运算符 | [ ] |
| 其他 | 如函数调用运算符() |
二、运算符的优先级和使用方式
| 优先级 | 运 算 符 | 含 义 | 要求运算对象的个数 | 结合方向 |
| 1 | ( ) | 圆括号 | 自左至右 | |
| [ ] | 下标运算符 | |||
| -> | 指向结构体成员运算符 | |||
| . | 结构体成员运算符 | |||
| 2 | ! | 逻辑非运算符 | 1 (单目运算符) | 自右至左 |
| ~ | 按位取反运算符 | |||
| ++ | 自增运算符 | |||
| -- | 自减运算符 | |||
| - | 负号运算符 | |||
| (类型) | 类型转换运算符 | |||
| * | 指针运算符 | |||
| & | 取地址运算符 | |||
| sizeof | 长度运算符 | |||
| 3 | * | 乘法运算符 | 2 (双目运算符) | 自左至右 |
| / | 除法运算符 | |||
| % | 求余运算符 | |||
| 4 | + | 加法运算符 | 2 (双目运算符) | 自左至右 |
| - | 减法运算符 | |||
| 5 | << | 左移运算符 | 2 (双目运算符) | 自左至右 |
| >> | 右移运算符 | |||
| 6 | < <= > >= | 关系运算符 | 2 (双目运算符) | 自左至右 |
| 7 | == | 等于运算符 | 2 (双目运算符) | 自左至右 |
| != | 不等于运算符 | |||
| 8 | & | 按位与运算符 | 2 (双目运算符) | 自左至右 |
| 9 | ^ | 按位异或运算符 | 2 (双目运算符) | 自左至右 |
| 10 | | | 按位或运算符 | 2 (双目运算符) | 自左至右 |
| 11 | && | 逻辑与运算符 | 2 (双目运算符) | 自左至右 |
| 12 | | | | 逻辑或运算符 | 2 (双目运算符) | 自左至右 |
| 13 | ? : | 条件运算符 | 3 (三目运算符) | 自右至左 |
| 14 | = += -= *= /= %= &= >>= <<= ^= | 赋值运算符 | 2 (双目运算符) | 自右至左 |
| 15 | , | 逗号运算符 (顺序求值运算符) | 2 (双目运算符) | 自左至右 |
说明:(1)同一优先级的运算符,运算次序由结合方向决定。
(2)不同的运算符要求有不同的运算对象个数,如+和-为双目运算符,要求在运算符两侧各有一个运算对象(如3+5、9-2等)。
(3)优先级总结:
初等运算符->单目运算符->算术运算符(先乘除,后加减)->关系运算符 ->逻辑运算符(不包括!)->条件运算符->赋值运算符->逗号运算符
以上的优先级由左到右、由上到下依次递减。
三、不同类型数据间的混合运算
在程序中经常会遇到不同类型的数据进行运算,如5*4.5。如果一个运算符两侧的数据类型不同,,则先自动进行类型转换,使二者成为同一种类型,然后进行运算。整型、实型、宇符型数据间可以进行混合运算。规律为:
(1)+、-、*、/运算的两个数中有一个数为 float或 double型,结果是double型,因为系统將所有 float 型数据都先转换为 double型,然后进行运算。
(2)如果 int 型与 float 或 double型数据进行运算,先把 int 型和 float 型数据转换double 型,然后进行运算,结果是double型。
(3)字符(char)型数据与整型数据进行运算,就是把宇符的 ASCII代码与整型数据进行运算。如:12十A',由于字行 A 的 ASCI 代码是 65,相当于12十65,等子77)如果字符型数据与实型数据进行运算,则将字符的 ASCII 代码转换为 double/型数据,然后进行运算。
以上的转换是编译系统自动完成的,读者不必过问。
分析下面的表达式,假设已指定i为整型变量,值为3,f为float 型变量,值为 2.5,d为double 型变量,值为 7.5。
10+'a’+i* f-d/3
编译时,从左至右扫描,运算次序如下:
① 进行10+’a’的运算,’a’'的值是整数 97,运算结果为 107。
②由于“ * ”比“ + ”优先级高,先进行" * "的运算。先将i与f都转成 double 型,运算结果为7.5,double型。
③整数 107 与 i * f 的积相加。先将整数 107 转换成双精度数,相加结果为 114.5,double 型。
④进行d/3 的运算,先将3转换成 double型,d/3结果为 2.5,double 型。
⑤将10 十 'a’ + i * f 的结果 114.5 与 d/3 的商2.5相减,结果为 112.0,double 型。
四、强制类型转换运算符
可以利用强制类型转换运算符将一个表达式转换成所需要的类型。如:
(double)a (将a装换为double型)
(int)x+y (将x+y的值转换为int型)
(float)(5%3) (将5%3的值转换为float)
其一般形式为:(类型名)(表达式)
注意,表达式应该用括号括起来。如果写成 (int) x+y
则只将x转换成整型,然后与y相加。
需要说明的是,在强制类型转换时,得到一个所需头型的中间数据,而原来变量的类型未发生变化。例如:a= (int) x
如果己定义x 为float 型变量,a 为整型变量,进行强制类型运算(int)x后得到一个int 类型的临时值,它的值等王x的整数部分,把它赋给a,注意x的值和类型都未变化,仍为 float型。该临时值在赋值后就不再存在了。
从上可知,有两种类型转换。一种是在运算时不必用户干预,系统自动进行的类型转换(自动类型转换),如 3十6.5。另一种是强制类型转换。当自动类型转换不能实现目的时,可以用强制类型转换。如%运算符要求其两侧均为整型量,若x为float 型,则x%3不合法,必须用(int)x%3。从文章开头的表格可以得知,强制类型转换运算优先于%运算,因此先进行(int) x的运算,得到一个整型的中间变量,然后再对3求余。此外,在函数调用时,有时为了使实参与形参类型一致,可以用强制类型转换运算符得到一个所需类型的参数。



