运算符必须有运算对象。C语言中的运算符的运算对象可以是一个,称单目运算符;运算对象也可以是两个,称双目运算符;运算对象还可以是三个,称三目运算符。单目运算符若放在运算对象的前面称为前缀单目运算符;若放在运算对象的后面称为后缀单目运算符。双目运算符都是放在两个运算对象的中间。三目运算符在C语言中只有一个(条件运算符),是夹在三个运算对象之间的。
每个运算符都代表对运算对象的某种运算,都有自己特定的运算规则。每个运算符运算的对象都规定了数据类型,同时运算结果也有确定的数据类型。
用运算符把运算对象连接起来所组成的运算式在C语言中称为"表达式"。每个表达式都可以按照运算符的运算规则进行运算,并最终获得一个值,称为表达式的值。
当表达式中出现多个运算符,计算表达式值时,就会碰到哪个先算,哪个后算的问题,我们把这个问题称为运算符的优先级。计算表达式值时,优先级高的运算要先进行。注意,在复杂的表达式中,用圆括号括住的部分要先算,其优先级别高于任何运算符。若在圆括号中又有圆括号,则内层圆括号优先于外层圆括号。
┌基本算术运算符( +,-,*,/,% )
┌算术运算符┤
│ └增1减1运算符( ++,-- )
│
│关系运算符( >,<,==,>=,<=,!= )
│逻辑运算符( !,&&,|| )
│
│ ┌基本赋值运算符( = )
┌基本运算符┤赋值运算符┤
│ │ └算术自反赋值运算符( +=,-=,*=,/=,%= )
│ │
│ │逗号运算符(,)
│ │条件运算符(? :)
C语言运算符┤ │数据长度运算符(sizeof)
│ │
│ │ ┌位逻辑运算符( ~,&,|,^ )
│ └位运算符┤位移位运算符( >>,<< )
│ └位自反赋值运算符( &=,|=,^=,>>=,<<= )
│
│ ┌强制运算符( ( ) )
└专用运算符┤下标运算符( [ ] )
│成员运算符( ->,.)
└指针运算符( &,*,+,- )
C语言运算符分类
注意C语言中的运算符都是键盘上的符号(如 |、~、^ 等)或若干符号的组合(如 &&、||、>>、<<、->等),书写或输入时不要出错。此外,少数运算符号有双重含义,主要有下列几个:
(1)"+"号。在算术运算中既表示单目的取正运算,又可表示双目的加法运算,在指针运算中表示双目的加法运算。
(2)"-"号。在算术运算中既表示单目的取负运算,又可表示双目的减法运算,在指针运算中表示双目的减法运算。
(3)"*"号。在算术运算中表示双目的乘法运算,在指针运算中表示指针变量指向的变量。
(4)"&"号。在位逻辑运算中表示双目"与"运算,在指针运算中表示取地址的运算。
这些两重含义运算符的理解与当时的运算对象有关,在学习时要注意区分。
算术运算符包括基本算术运算符和增1、减1运算符,其中基本运算符常简称为算术运算符。
基本算术运算符是对数据进行简单算术运算的。要注意字符型数据也可以看成整型数据,参加基本算术运算。
?/P>
对象数 | 名称 | 运算符 | 运算规则 | 运算对象 | 运算结果 | 结合性 |
单目 | 正负 | + | 取原值 | 整型或实型 | 整型或实型 | 自右向左 |
双目 | 加 | + | 加法 | 自左向右 | ||
模 | % | 整除取余 | 整型 | 整型 |
双目除运算(/)和运算对象的数据类型有关。若两个对象都是整型数据,该运算称为"整除",即获得的商是整数。若商有小数,则截去小数部分。若两个运算对象有一个或两个都是实型,则运算结果是实型。例如,14/5,结果为2;而14/5.0,则结果为2.8。
双目模运算(%)的对象必须是整型数据,结果是整除后的余数。例如,14%5的结果为4(商为2);14%4的结果为2(商为3)。注意运算结果的符号与被除数相同,例如,13%3、13%-3的结果均为1(商分别为4、-4);-13%3、-13%-3的结果均为-1(商分别为-4、4)。
算术运算符的优先级规定如下:
⑴单目基本算术运算符 优先于 双目基本算术运算符
⑵*、/、% 优先于 +、-
⑶同级单目基本算术运算符的结合性是自右向左
⑷同级双目基本算术运算符的结合性是自左向右
【例】基本算术运算符的使用。
设变量定义如下:int n=10,m=3;
float f=5.0,g=10.0;
double d=5.0,e=10.0;
则:-n的结果是-10
n+m、n-m、n*m、n%m的结果分别为13、7、30、3、1
d+e、d-e、d*e、d/e的结果分别为15.0、-5.0、50.0、0.5
n+m-f*g/d的运算顺序相当于(n+m)-((f*g)/d),结果是3.0
n%m*f*d的运算顺序相当于((n%m)*f)*d,结果是25.0
增1减1运算符都是单目运算符,是用来对整型、字符型、指针型以及数组的元素等变量进行算术运算的,运算的结果仍是原类型,并存回原运算对象。用增1减1运算符和运算对象组成表达式时,运算符可以放在运算对象的前面(称前缀),也可以放在运算对象的后面(称后缀),前缀和后缀的功能略有不同。
增1(或减1)运算符作为前缀使用时,是先对运算对象加1(或减1),然后再使用加1(或减1)后的运算对象。增1(或减1)运算符作为后缀使用时,是先使用不加1(或减1)的运算对象,然后再对运算对象加1(或减1)。
对象数 | 名称 | 运算符 | 运算规则 | 运算对象 | 运算结果 | 结合性 |
单目 | 增1(前缀) 增1(后缀) 减1(前缀) 减1(后缀) | ++ ++ -- -- | 先加1,后使用 先使用,后加1 先减1,后使用 先使用,后减1 | 整型或 字符型或 指针型或 下标等 | 同运算对 象的类型 | 自右向左 |
增1减1运算符的优先级如下:
⑴增1减1运算符 优先于 双目基本算术运算符
⑵增1减1运算符和单目基本算术运算符+、-同级别,结合性是自右向左
例如,设整型变量a为2,则:
++a+1 结果为4,变量a为3
a--+1 结果为3,变量a为1
当出现难以区分的若干个+或-组成运算符串时,C语言规定,自左向右取尽可能多的符号组成运算符。
例如,设整型变量a、b均为2,则:
a+++b 应理解成(a++)+b,结果为4,a为3,b不变
a---b 应理解成(a--)-b,结果为0,a为1,b不变
【例】增1减1运算符的使用。
设变量定义如下:char c1='b',c2='B';(c1、c2可看成整型,其值分别为98、66)
则:++c1的值是99,运算后c1的值是'c'
c1--的值是98,运算后c1的值是'a'
c1+++c2的值是164,运算后c1的值是'c',c2的值是'B'
c1---c2的值是32,运算后c1的值是'a',c2的值是'B'
关系运算符是用来比较两个数据大小的,运算的结果是成立或不成立。如果成立,则结果为逻辑值"真",用整数"1"表示;如果不成立,则结果为逻辑值"假",用整数"0"表示。
?/P>
| | | | | | |
| | | | | | |
所有关系运算符都是双目运算符,所组成的表达式称为关系表达式。关系表达式的结果是逻辑值,若为"真"用整数1表示;若为"假"用整数0 表示。
关系运算符可以用来比较两个数值型数据的大小,也可以比较两个字符型数据的大小。字符数据比较时是按该字符对应的ASCII代码值的大小进行比较,其实质也是数值比较。
关系运算符的优先级如下:
⑴ 算术运算符优先于关系运算符
⑵ <,<=,>,>= 优先于 ==,!=
⑶ <,<=,>,>= 同级,结合性是自左向右
⑷ ==,!= 同级,结合性是自左向右
因此,"3<2<2"作为关系式来说是正确的,先计算"3<2"的结果为"0"(假);再计算"0<1"的结果是"1"(真)。当然,这个计算过程与原式数学中的含义(3<2 并且2<1)是不同的,这一点请同学们特别注意。
【例】关系运算符的使用。
设变量定义如下:char c1='a',c2='A';(c1、c2可看成整型,其值分别为97、65)
int n1=65,n2=97;
float f1=0.3E1,f2=3.0001;
则:c1>c2、n1<n2、f1==f2的值依次是1、1、0
c1>=n1、c2>=n2、c1==n2的值依次是1、0、1
f1>c1、f2<c2、f1= =n1-62的值依次是0、1、1
c1>c2>=1<=0==1!=0的值是0 注:运算顺序相当于((((c1>c2)>=1)<=0)==1)!=0
c1>c2>=n1<=n2==f1!=f2的值是1
逻辑运算符是对两个关系式或逻辑值进行运算的,运算结果仍是逻辑值。在C语言中,逻辑值是用数值非0和0来表示逻辑真和假的,所以逻辑运算符也可以对两个数值型数据进行运算,包括整型、实型、字符型等数据。
?/P>
对象数 | 名称 | 运算符 | 运算规则 | 运算对象 | 运算结果 | 结合性 |
单目 | 逻辑非 | ! | | 数值型或 | 逻辑值 | 自右向左 |
双目 | 逻辑与 | && | 自左向右 |
a | 非运算 |
0(假) 非0(真) | 1(真) 0(假) |
对象1 a | 对象2 b | 与运算 a&&b | 或运算 a||b |
0(假) 0(假) 非0(真) 非0(真) | 0(假) 非0(真) 0(假) 非0(真) | 0(假) 0(假) 0(假) 1(真) | 0(假) 1(真) 1(真) 1(真) |
单目逻辑运算符(!)是前缀运算符,双目逻辑运算符是插在两个运算对象中间,所组成的表达式称为逻辑表达式。逻辑表达式的运算结果是逻辑值。若运算结果为逻辑真,则获得1;若运算结果是逻辑假,由获得0。
要特别注意逻辑真的表示方法,对参加运算的逻辑真,是用非0值来表示的;而运算结果的逻辑真是用数值1来表示的。而对逻辑假,不管是参加运算,还是运算结果,都是用数值0来表示的。
逻辑运算符的优先级如下:
⑴ ! 优先于 双目算术运算符 优先于 关系运算符 优先于 && 优先于 ||
⑵ 单目逻辑运算符!和单目算术运算符是同级别的,结合性是自右向左
⑶ 双目逻辑运算符的结合性是自左向右
!的结合性是自右向左的,即先计算最右边的!,再依次向左计算其它的!。例如,!!!10的计算顺序相当于!(!(!10)),结果为0。&&和||的结合性是自左向右的,即先计算最左边的&&(或||),再依次向右计算其它的&&(或||)。例如,10&&1&&0的计算顺序相当于(10&&1)&&0,结果为0。又如,0||0||5的计算顺序相当于(0||0)||5,结果为1。
还要提醒读者注意的是,用&&对两个表达式进行计算时,若第一个表达式的值为"假",则运算结果与第二个表达式的值无关,结果肯定为"假",所以C语言规定此时第二个表达式将不再计算。同样用||对两个表达式进行计算时,若第一个表达式的值为"真",则运算结果与第二个表达式的值无关,结果肯定为"真",所以C语言规定此时第二个表达式也不再计算。例如定义a为整型变量,则0&&(a++)的运算结果为0,a值不变;1||(a++)的运算结果为1,a值也不变。
【例】逻辑运算符的使用。
设变量定义如下:char c1='a',c2='A';(c1、c2可看成整型,其值分别为97、65)
int n1=65,n2=97;
float f1=3.0,f2=3.0001;
则:!c1的值是0,n1&&n2的值是1,f1||f2的值是1,!(c2>c1)的值是1,!n2>n1的值是0,f1>f2||!c1的值是0,n1+32==n2&&n1==c2的值是1。