目录
一、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求余。此外,在函数调用时,有时为了使实参与形参类型一致,可以用强制类型转换运算符得到一个所需类型的参数。
|