2.5.3 表达式中各类数值型数据间的混合运算
在表达式中常遇到不同类型数据之间进行运算,如
10+′a′+1.5-8765.1234*′b′
在进行运算时,不同类型的数据要先转换成同一类型,然后进行运算。转换的规则按图2.7所示。

假设已指定i为整型变量,f为float变量,d为double型变量,e为long型,有下面表达式:
10+′a′+i*f-d/e
运算次序为: ①进行10+′a′的运算,先将′a′转换成整数97,运算结果为107。②进行i*f的运算。先将i与f都转换成double型,运算结果为double型。③整数107与i*f的积相加。先将整数107转换成双精度数(小数点后加若干个0,即107.000…00),结果为double型。④将变量e转换成double型,d/e结果为double型。⑤将10+′a′+i*f的结果与d/e的商相减,结果为double型。
上述的类型转换是由系统自动进行的。
2.5.4 自增和自减运算符
在C和C++中,常在表达式中使用自增(++)和自减(--)运算符,他们的作用是使变量的值增1或减1,如
++i(在使用i之前,先使i的值加1,如果i的原值为3,则执行j=++i后,j的值为4)
--i (在使用i之前,先使i的值减1,如果i的原值为3,则执行j=--i后,j的值为2)
i++ (在使用i之后,使i的值加1,如果i的原值为3,则执行j=i++后,j的值为3,然后i变为4)
i--(在使用i之后,使i的值减1,如果i的原值为3,则执行j=i--后,j的值为3,然后i变为2)
++i是先执行i=i+1后,再使用i的值;而i++是先使用i的值后,再执行i=i+1。
正确地使用++和--,可以使程序简洁、清晰、高效。
请注意:
(1) 自增运算符(++)和自减运算符(--)只能用于变量,而不能用于常量或表达式。
(2) ++和--的结合方向是“自右至左”,见附录B。
(3) 自增运算符(++)和自减运算符(--)使用十分灵活,但在很多情况下可能出现歧义性,产生“意想不到”的副作用。
(4) 自增(减)运算符在C++程序中是经常见到的,常用于循环语句中,使循环变量自动加1。也用于指针变量,使指针指向下一个地址。
2.5.5 强制类型转换运算符
在表达式中不同类型的数据会自动地转换类型,以进行运算。有时程序编制者还可以利用强制类型转换运算符将一个表达式转换成所需类型。例如:
(double)a (将a转换成double类型)
(int)(x+y) (将x+y的值转换成整型)
(float)(5%3) (将5%3的值转换成float型)
强制类型转换的一般形式为
(类型名)(表达式)
注意: 如果要进行强制类型转换的对象是一个变量,该变量可以不用括号括起来。如果要进行强制类型转换的对象是一个包含多项的表达式,则表达式应该用括号括起来。如果写成
(int)x+y
则只将x转换成整型,然后与y相加。
以上强制类型转换的形式是原来C语言使用的形式,C++把它保留了下来,以利于兼容。C++还增加了以下形式:
类型名(表达式)
如int(x) 或 int(x+y)
类型名不加括号,而变量或表达式用括号括起来。这种形式类似于函数调用。但许多人仍习惯于用第一种形式,把类型名包在括号内,这样比较清楚。
需要说明的是在强制类型转换时,得到一个所需类型的中间变量,但原来变量的类型未发生变化。例如:
(int)x
如果x原指定为float型,值为3.6,进行强制类型运算后得到一个int型的中间变量,它的值等于3,而x原来的类型和值都不变。
例2.4 强制类型转换。
#include <iostream>
using namespace std;
int main( )
{ float x;
int i;
x=3.6;
i=(int)x;
cout<<″x=″<<x<<″,i=″<< i<<endl;
return 0;
}
运行结果如下:
x=3.6,i=3
x的型仍为float型,值仍等于3.6。
由上可知,有两种类型转换,一种是在运算时不必用户指定,系统自动进行的类型转换,如3+6.5。第二种是强制类型转换。当自动类型转换不能实现目的时,可以用强制类型转换。此外,在函数调用时,有时为了使实参与形参类型一致,可以用强制类型转换运算符得到一个所需类型的参数。
2.6 赋值运算符与赋值表达式
2.6.1 赋值运算符
赋值符号“=”就是赋值运算符,它的作用是将一个数据赋给一个变量。如“a=3”的作用是执行一次赋值操作(或称赋值运算)。把常量3赋给变量a。也可以将一个表达式的值赋给一个变量。
2.6.2 赋值过程中的类型转换
如果赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值时会自动进行类型转换。
(1) 将浮点型数据(包括单、双精度)赋给整型变量时,舍弃其小数部分。
(2) 将整型数据赋给浮点型变量时,数值不变,但以指数形式存储到变量中。
(3) 将一个double型数据赋给float变量时,要注意数值范围不能溢出。
(4) 字符型数据赋给整型变量,将字符的ASCII码赋给整型变量。
评论