c语⾔表达式优先级最⾼的是,C语⾔运算符优先级表
运算符的种类C语⾔的运算符可分为以下⼏类:
1.算术运算符
⽤于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、⾃增(++)、⾃减(--)共七种。
2.关系运算符
⽤于⽐较运算。包括⼤于(>)、⼩于(=)、⼩于等于(<=)和不等于(!=)六种。
3.逻辑运算符
⽤于逻辑运算。包括与(&&)、或(||)、⾮(!)三种。
4.位操作运算符
参与运算的量,按⼆进制位进⾏运算。包括位与(&)、位或(|)、位⾮(~)、位异或(^)、左移(<>)六种。
5.赋值运算符
⽤于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,^=,>>=,<<=)三类共⼗⼀种。
6.条件运算符
这是⼀个三⽬运算符,⽤于条件求值(?:)。
7.逗号运算符
⽤于把若⼲表达式组合成⼀个表达式(,)。
8.指针运算符
⽤于取内容(*)和取地址(&)⼆种运算。
9.求字节数运算符
⽤于计算数据类型所占的字节数(sizeof)。
10.特殊运算符
有括号(),下标[],成员(→,.)等⼏种。
优先级和结合性
C语⾔中,运算符的运算优先级共分为15级。1级最⾼,15级最低。在表达式中,优先级较⾼的先于优先级较低的进⾏运算。⽽在⼀个运算量两侧的运算符优先级相同时,则按运算符的结合性所规定的结合⽅向处理。C语⾔中各运算符的结合性分为两种,即左结合性(⾃左⾄右)和右结合性(⾃右⾄左)。例如算术运算符的结合性是⾃左⾄右,即先左后右。如有表达式x-y+z则y应先与“-”号结合,执⾏x-y运算,然后再执⾏+z的运算。这种⾃左⾄右的结合⽅向就称为“左结合性”。⽽⾃右⾄左的结合⽅向称为“右结合性”。最典型的右结合性运算符是赋值运算符。如x=y=z,由于“=”的右结合性,应先执⾏y=z再执⾏x=(y=z)运算。C语⾔运算符中有不少为右结合性,应注意区别,以避免理解错误。
算术运算符和算术表达式基本的算术运算符
1.加法运算符“+”加法运算符为双⽬运算符,即应有两个量参与加法运算。如a+b,4+8等。具有右结合性。
2.减法运算符“-”减法运算符为双⽬运算符。但“-”也可作负值运算符,此时为单⽬运算,如-x,-5等具有左结合性。
3.乘法运算符“*”双⽬运算,具有左结合性。
4.除法运算符“/”双⽬运算具有左结合性。参与运算量均为整型时,结果也为整型,舍去⼩数。如果运算量中有⼀个是实型,则结果为双精度实型。
void main(){
printf("\n\n%d,%d\n",20/7,-20/7);
printf("%f,%f\n",20.0/7,-20.0/7);
}
双⽬运算具有左结合性。参与运算量均为整型时,结果也为整型,舍去⼩数。如果运算量中有⼀个是实型,则结果为双精度实型。
printf("\n\n%d,%d\n",20/7,-20/7);
printf("%f,%f\n",20.0/7,-20.0/7);
本例中,20/7,-20/7的结果均为整型,⼩数全部舍去。⽽20.0/7和-20.0/7由于有实数参与运算,因此结果也为实型。
5.求余运算符(模运算符)“%”双⽬运算,具有左结合性。要求参与运算的量均为整型。求余运算的结果等于两数相除后的余数。
void main(){
printf("%d\n",100%3);
}
双⽬运算,具有左结合性。求余运算符% 要求参与运算的量均为整型。本例输出100除以3所得的余数1。
⾃增1,⾃减1运算符
⾃增1运算符记为“++”,其功能是使变量的值⾃增1。⾃减1运算符记为“--”,其功能是使变量值⾃减1。⾃增1,⾃减1运算符均为单⽬运算,都具有右结合性。可有以下⼏种形式: ++i i⾃增1后再参与其它运算。--i i⾃减1后再参与其它运算。
i++  i参与运算后,i的值再⾃增1。
i--  i参与运算后,i的值再⾃减1。
在理解和使⽤上容易出错的是i++和i--。特别是当它们出在较复杂的表达式或语句中时,常常难于弄清,因此应仔细分析。
void main(){
int i=8;
printf("%d\n",++i);
printf("%d\n",--i);
printf("%d\n",i++);
printf("%d\n",i--);
printf("%d\n",-i++);
printf("%d\n",-i--);
} i
i
i
i
i
i
i
printf("%d\n",++i);
printf("%d\n",--i);
printf("%d\n",i++);
printf("%d\n",i--);
printf("%d\n",-i++);
printf("%d\n",-i--);
i的初值为8
第2⾏i加1后输出故为9;
第3⾏减1后输出故为8;
第4⾏输出i为8之后再加1(为9);
第5⾏输出i为9之后再减1(为8) ;
第6⾏输出-8之后再加1(为9);
第7⾏输出-9之后再减1(为8)
void main(){
int i=5,j=5,p,q;
p=(i++)+(i++)+(i++);
q=(++j)+(++j)+(++j);
printf("%d,%d,%d,%d",p,q,i,j);
}
i
i+i+i--->p,i+1-->i,i+1-->i,i+1-->i
j+1->j,j+1->j,j+1->j,j+j+j->q int i=5,j=5,p,q;
p=(i++)+(i++)+(i++);
q=(++j)+(++j)+(++j);
这个程序中,对P=(i++)+(i++)+(i++)应理解为三个i相加,故P值为15。然后i再⾃增1三次相当于加3故i的最后值为8。⽽对于q 的值则不然,q=(++j)+(++j)+(++j)应理解为q先⾃增1,再参与运算,由于q⾃增1三次后值为8,三个8相加的和为24,j的最后值仍为8。算术表达式表达式是由常量、变量、函数和运算符组合起来的式⼦。⼀个表达式有⼀个值及其类型,它们等于计算表达式所得结果的值和类型。表达式求值按运算符的优先级和结合性规定的顺序进⾏。单个的常量、变量、函数可以看作是表达式的特例。
算术表达式
是由算术运算符和括号连接起来的式⼦, 以下是算术表达式的例⼦:
a+b  (a*2)/c (x+r)*8-(a+b)/7  ++i sin(x)+sin(y)  (++i)-(j++)+(k--)
赋值运算符和赋值表达式
简单赋值运算符和表达式,简单赋值运算符记为“=”。由“= ”连接的式⼦称为赋值表达式。其⼀般形式为: 变量=表达式 例如:
x=a+b
w=sin(a)+sin(b)
y=i+++--j 赋值表达式的功能是计算表达式的值再赋予左边的变量。赋值运算符具有右结合性。因此
a=b=c=5
可理解为
a=(b=(c=5))
在其它⾼级语⾔中,赋值构成了⼀个语句,称为赋值语句。⽽在C中,把“=”定义为运算符,从⽽组成赋值表达式。凡是表达式可以出现的地⽅均可出现赋值表达式。例如,式⼦x=(a=5)+(b=8)是合法的。它的意义是把5赋予a,8赋予b,再把a,b相加,和赋予x ,故x应等于13。
在C语⾔中也可以组成赋值语句,按照C语⾔规定,任何表达式在其未尾加上分号就构成为语句。因此如x=8;a=b=c=5;都是赋值语句,在前⾯各例中我们已⼤量使⽤过了。
如果赋值运算符两边的数据类型不相同,系统将⾃动进⾏类型转换,即把赋值号右边的类型换成左边的类型。具体规定如下:
1.实型赋予整型,舍去⼩数部分。前⾯的例
2.9已经说明了这种情况。
2.整型赋予实型,数值不变,但将以浮点形式存放,即增加⼩数部分(⼩数部分的值为0)。
3.字符型赋予整型,由于字符型为⼀个字节,⽽整型为⼆个字节,故将字符的ASCII码值放到整型量的低⼋位中,⾼⼋位为0。
4.整型赋予字符型,只把低⼋位赋予字符量。
void main(){
int a,b=322;
float x,y=8.88;
char c1='k',c2;
a=y;
x=b;
a=c1;
c2=b;
printf("%d,%f,%d,%c",a,x,a,c2);
}
int a,b=322;
float x,y=8.88;
char c1='k',c2;
printf("%d,%f,%d,%c",a=y,x=b,a=c1,c2=b);
本例表明了上述赋值运算中类型转换的规则。a为整型,赋予实型量y值8 88后只取整数8。x为实型,赋予整型量b值322,后增加了⼩数部分。字符型量c1赋予a变为整型,整型量b赋予c2 后取其低⼋位成为字符型(b的低⼋位为01000010,即⼗进制66,按ASCII码对应于字符B)。
复合赋值符及表达式
在赋值符“=”之前加上其它⼆⽬运算符可构成复合赋值符。如
+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=。构成复合赋值表达式的⼀般形式为: 变量 双⽬运算符=表达式 它等效于变量=变量 运算符 表达式例如: a+=5 等价于a=a+5  x*=y+7 等价于x=x*(y+7)  r%=p 等价于r=r%p
复合赋值符这种写法,对初学者可能不习惯,但⼗分有利于编译处理,能提⾼编译效率并产⽣质量较⾼的⽬标代码。逗号运算符和逗号表达式在
逗号运算符
C语⾔中逗号“,”也是⼀种运算符,称为逗号运算符。其功能是把两个表达式连接起来组成⼀个表达式, 称为逗号表达式。
其⼀般形式为: 表达式1,表达式2 其求值过程是分别求两个表达式的值,并以表达式2的值作为整个逗号表达式的值。
void main(){
int a=2,b=4,c=6,x,y;
x=a+b,y=b+c;
printf("y=%d,x=%d",y,x);
}
a
x
本例中,y等于整个逗号表达式的值,也就是表达式2的值,x是第⼀个表达式的值。对于逗号表达式还要说明两点:
1.逗号表达式⼀般形式中的表达式1和表达式2 也可以⼜是逗号表达式。例如: 表达式1,(表达式2,表达式3) 形成了嵌套情形。因此可以把逗号表达式扩展为以下形式:表达式1,表达式2,…表达式n 整个逗号表达式的值等于表达式n的值。
2.程序中使⽤逗号表达式,通常是要分别求逗号表达式内各表达式的值,并不⼀定要求整个逗号表达式的值。
3.并不是在所有出现逗号的地⽅都组成逗号表达式,如在变量说明中,函数参数表中逗号只是⽤作各变量之间的间隔符。
[Practice] //arithmeticint a,b,c;
float d;
a=11;
b=235;
c语言中的逗号表达式
c=a+b-a*b;
d=(float)c/(float)a;
a=c/a;'Vtable
a,2,0
b,2,0
c,2,0
d,4,0.0
of Vtable
'Vupdate
1,0;2,0;3,0
4,0.0
1,11
2,235
3,-2339
4,-212.636368
1,-212
of Vupdate