操作符的类型、错误率和紧密结合性
C词汇中操作符和函数数目之多, 在高阶词汇中是罕见的。便是多样的操作符和函数使C词汇机能极为健全。 这也是C词汇的主要就特征众所周知。
C词汇的操作符不但具备相同的错误率, 而且除了两个特征,是它的紧密结合性。在函数中, 各演算量参予演算的顺序不但要严格遵守操作符错误率其它明确规定,更要受操作符紧密结合性的阻碍, 以期确认是自从左到右展开演算却是自右向左展开演算。 此种紧密结合性是其他高级词汇的操作符所没的,因而也减少了C词汇的复杂程度。
操作符的类型C词汇的操作符可分成下列四类:
1.微积分操作符
用作各种类型值演算。主要就包括加(+)、减(-)、乘(*)、除(/)、求余(或称模演算,%)、自增(++)、自减(–)共八种。
2.亲密关系操作符
用作较为演算。主要就包括小于(>)、小于(<)、等同于(==)、 小于等同于(>=)、小于等同于(<=)和不等同于(!=)五种。
3.方法论操作符
用作方法论演算。主要就包括与(&&)、或(||)、非(!)四种。
4.TNUMBERCCC13操作符
参予演算的量,按chunk展开演算。主要就包括位与(&)、位或(|)、十一位(~)、位XOR(^)、右移(<<)、右移(>>)五种。
5.函数操作符
用作函数演算,分成单纯赋值(=)、A43EI235E微积分函数(+=,-=,*=,/=,%=)和A43EI235E位演算函数(&=,|=,^=,>>=,<<=)四类共八种。
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.除法操作符“/”双目演算具备左紧密结合性。参予演算量均为整型时, 结果也为整型,舍去小数。如果演算量中有两个是实型,则结果为双精度实型。
双目演算具备左紧密结合性。参予演算量均为整型时, 结果也为整型,舍去小数。如果演算量中有两个是实型,则结果为双精度实型。
例: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的初值为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<–5,j<–5
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++)应理解为三个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);
printf(“%d,%f,%d,%c”,a=y,x=b,a=c1,c2=b);
本例表明了上述函数演算中类型转换的规则。a为整型,赋予实型量y值888后只取整数8。x为实型,赋予整型量b值322, 后减少了小数部分。字符型量c1赋予a变为整型,整型量b赋予c2 后取其低八位成为字符型(b的低八位为01000010,即十进制66,按ASCII码对应于字符B)。
A43EI235E函数符及函数
在函数符“=”之前加上其他二目操作符可构成A43EI235E函数符。如
+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=。 构成A43EI235E函数函数的一般形式为: 变量 双目操作符=函数 它等效于 变量=变量 操作符 函数 例如: a+=5 等价于a=a+5 x*=y+7 等价于x=x*(y+7) r%=p 等价于r=r%p
A43EI235E函数符此种写法,对初学者可能不习惯, 但极为有利于编译处理,能提高编译效率并产生质量较高的目标代码。双引号操作符和双引号函数在
双引号操作符
C词汇中双引号“,”也是一种操作符,称为双引号操作符。 其机能是把两个函数连接起来组成两个函数, 称为双引号函数。
其一般形式为: 函数1,函数2 其解释器过程是分别求两个表达式的值,并以函数2的值作为整个双引号函数的值。
void main{
int a=2,b=4,c=6,x,y;
y=(x=a+b),(b+c);
printf(“y=%d,x=%d”,y,x);
}
a<–2,b<–4,c<–6,x<–0,y<–0
x<–a+b,y<—b+c
本例中,y等同于整个双引号函数的值,也是函数2的值,x是第两个函数的值。对于双引号函数更要说明两点:
1.双引号函数一般形式中的函数1和函数2 也可以又是双引号函数。例如: 函数1,(函数2,函数3) 形成了嵌套情形。因而可以把双引号函数扩展为下列形式: 函数1,函数2,…函数n 整个双引号函数的值等于函数n的值。
2.程序中使用双引号函数,通常是要分别求双引号函数内各函数的值,并不一定要求整个双引号函数的值。
3.并不是在所有出现双引号的地方都组成双引号函数,如在变量说明中,函数参数表中双引号只是用作各变量之间的间隔符。
小结
1.操作符错误率和紧密结合性
一般而言,单目操作符错误率较高,函数操作符错误率低。 微积分操作符错误率较高,亲密关系和方法论操作符错误率较低。 多数操作符具备左紧密结合性,单目操作符、长瓣演算符、 函数
2.函数
函数是由操作符连接常量、变量、函数所组成的式子。 每个函数都有两个值和类型。 函数解释器按操作符的错误率和紧密结合性所明确规定的顺序展开。