C语言设计

第11章


下图表示了类型自动转换的规则。
double
long
unsigned
【例 3.12】
main(){
  float PI=3.14159;
  int s,r=5;
    s=r*r*PI;
  printf("s=%d ",s);
int
char,short
}
谭浩强      C 语言程序设计               2001 年 5 月 1 日
本例程序中,PI 为实型;s,r 为整型。在执行 s=r*r*PI 语句时,r 和 PI 都转换成 double
型计算,结果也为 double 型。但由于 s 为整型,故赋值结果仍为整型,舍去了小数部分。
强制类型转换
强制类型转换是通过类型转换运算来实现的。
其一般形式为:
        (类型说明符)  (表达式)
其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。
例如:
        (float) a            把 a 转换为实型
                (int)(x+y)          把 x+y 的结果转换为整型
在使用强制转换时应注意以下问题:
1) 类型说明符和表达式都必须加括号(单个变量可以不加括号),如把(int)(x+y)写成
(int)x+y 则成了把 x 转换成 int 型之后再与 y 相加了。
2) 无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进
行的临时性转换,而不改变数据说明时对该变量定义的类型。
【例 3.13】
main(){
  float f=5.75;
  printf("(int)f=%d,f=%f ",(int)f,f);
}
本例表明,f 虽强制转为 int 型,但只在运算中起作用,是临时的,而 f 本身的类型并不
改变。因此,(int)f 的值为 5(删去了小数)而 f 的值仍为 5.75。
3.8 算术运算符和算术表达式
C语言中运算符和表达式数量之多,在高级语言中是少见的。正是丰富的运算符和表达
式使C语言功能十分完善。这也是C语言的主要特点之一。
C语言的运算符不仅具有不同的优先级,而且还有一个特点,就是它的结合性。在表达
式中,各运算量参与运算的先后顺序不仅要遵守运算符优先级别的规定,还要受运算符结合
性的制约,以便确定是自左向右进行运算还是自右向左进行运算。这种结合性是其它高级语
言的运算符所没有的,因此也增加了C语言的复杂性。
3.8.1 C 运算符简介
C语言的运算符可分为以下几类:
1. 算术运算符:用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、
自增(++)、自减(--)共七种。
2. 关系运算符:用于比较运算。包括大于(>)、小于(=)、小于等
于(>)六种。
5. 赋值运算符:用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位
运算赋值(&=,|=,^=,>>=,<<=)三类共十一种。
6. 条件运算符:这是一个三目运算符,用于条件求值(?:)。
7. 逗号运算符:用于把若干表达式组合成一个表达式(,)。
8. 指针运算符:用于取内容(*)和取地址(&)二种运算。
9. 求字节数运算符:用于计算数据类型所占的字节数(sizeof)。
10. 特殊运算符:有括号(),下标[],成员(→,.)等几种。
3.8.2 算术运算符和算术表达式
1. 基本的算术运算符
? 加法运算符“+”:加法运算符为双目运算符,即应有两个量参与加法运算。如 a+b,4+8
等。具有右结合性。
? 减法运算符“-”:减法运算符为双目运算符。但“-”也可作负值运算符,此时为单目
运算,如-x,-5 等具有左结合性。
? 乘法运算符“*”:双目运算,具有左结合性。
? 除法运算符“/”:双目运算具有左结合性。参与运算量均为整型时,结果也为整型,舍
去小数。如果运算量中有一个是实型,则结果为双精度实型。
〖例 3.14〗
main(){
  printf(" %d,%d ",20/7,-20/7);
  printf("%f,%f ",20.0/7,-20.0/7);
 }
本例中,20/7,-20/7 的结果均为整型,小数全部舍去。而 20.0/7 和-20.0/7 由于有实数
参与运算,因此结果也为实型。
? 求余运算符(模运算符)“%”:双目运算,具有左结合性。要求参与运算的量均为整型。
求余运算的结果等于两数相除后的余数。
【例 3.15】
main(){
  printf("%d ",100%3);
 }
本例输出 100 除以 3 所得的余数 1。
2. 算术表达式和运算符的优先级和结合性
表达式是由常量、变量、函数和运算符组合起来的式子。一个表达式有一个值及其类型,
它们等于计算表达式所得结果的值和类型。表达式求值按运算符的优先级和结合性规定的顺
序进行。单个的常量、变量、函数可以看作是表达式的特例。
谭浩强      C 语言程序设计               2001 年 5 月 1 日
算术表达式是由算术运算符和括号连接起来的式子。
? 算术表达式:用算术运算符和括号将运算对象(也称操作数)连接起来的、符合 C 语
法规则的式子。
以下是算术表达式的例子:
a+b
(a*2)/c
(x+r)*8-(a+b)/7
++I
sin(x)+sin(y)
(++i)-(j++)+(k--)
? 运算符的优先级:C语言中,运算符的运算优先级共分为 15 级。1 级最高,15 级最低。
在表达式中,优先级较高的先于优先级较低的进行运算。而在一个运算量两侧的运算符
优先级相同时,则按运算符的结合性所规定的结合方向处理。
? 运算符的结合性:C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结
合性(自右至左)。例如算术运算符的结合性是自左至右,即先左后右。如有表达式 x-y+z
则 y 应先与“-”号结合,执行 x-y 运算,然后再执行+z 的运算。这种自左至右的结合
方向就称为“左结合性”。而自右至左的结合方向称为“右结合性”。 最典型的右结合
性运算符是赋值运算符。如 x=y=z,由于“=”的右结合性,应先执行 y=z 再执行 x=(y=z)
运算。C语言运算符中有不少为右结合性,应注意区别,以避免理解错误。
3. 强制类型转换运算符
其一般形式为:
(类型说明符)  (表达式)
其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。
例如:
        (float) a            把 a 转换为实型
                (int)(x+y)          把 x+y 的结果转换为整型
4. 自增、自减运算符
自增1,自减1运算符:自增 1 运算符记为“++”,其功能是使变量的值自增 1。
自减 1 运算符记为“--”,其功能是使变量值自减 1。
自增 1,自减 1 运算符均为单目运算,都具有右结合性。可有以下几种形式:
++i    i 自增 1 后再参与其它运算。
--i    i 自减 1 后再参与其它运算。
i++    i 参与运算后,i 的值再自增 1。
i--    i 参与运算后,i 的值再自减 1。
在理解和使用上容易出错的是 i++和 i--。 特别是当它们出在较复杂的表达式或语句中
时,常常难于弄清,因此应仔细分析。
【例 3.16】
main(){
  int i=8;
  printf("%d ",++i);
  printf("%d ",--i);
  printf("%d ",i++);
  printf("%d ",i--);
  printf("%d ",-i++);
  printf("%d ",-i--);
 }
谭浩强      C 语言程序设计               2001 年 5 月 1 日
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)。
小说推荐
返回首页返回目录