C++(二):运算符与表达式
来源:程序员人生 发布时间:2014-11-14 08:15:46 阅读次数:2963次
C++的运算符
C++的运算符10分丰富,使得C++的运算10分灵活方便。例如把赋值号(=)也作为运算符处理,这样,a=b=c=4就是合法的表达式,这是与其他语言不同的。C++提供了以下运算符:
- 算术运算符
+(加) -(减) *(乘) /(除) %(整除求余) ++(自加) --(自减) - 关系运算符
>(大于) <(小于) ==(等于) >=(大于或等于) <=(小于或等于) !=(不等于) - 逻辑运算符
&&(逻辑与) ||(逻辑或) !(逻辑非) - 位运算符
<<(按位左移) >>(按位右移) &(按位与) |(按位或) ^(按位异或) ~(按位取反) - 赋值运算符 (=及其扩大赋值运算符)
- 条件运算符 (?:)
- 逗号运算符 (,)
- 指针运算符 (*)
- 援用运算符和地址运算符 (&)
- 求字节数运算符(sizeof)
- 强迫类型转换运算符( (类型) 或类型( ))
- 成员运算符 (.)
- 指向成员的运算符 (->)
- 下标运算符 ([ ])
- 其他 (如函数调用运算符())
C++算术运算符与算术表达式
基本的算术运算符
在本章中主要介绍算术运算符与算术表达式,赋值运算符与赋值表达式,逗号运算符与逗号表达式,其他运算符将在以后各章中陆续介绍。
常见算数运算符
运算符 |
说明 |
举例 |
+ |
加法运算符,或正值运算符 |
3+5,+3 |
- |
减法运算符,或负值运算符 |
5⑵,⑶ |
* |
乘法运算符 |
3*5 |
/ |
除法运算符 |
5/3 |
% |
模运算符,或称求余运算符 |
%两侧均应为整型数据,如7%4的值为3 |
需要说明,两个整数相除的结果为整数,如5/3的结果值为1,舍去小数部份。但是,如果除数或被除数中有1个为负值,则舍入的方向是不固定的。例如,⑸/3在有的C++系统上得到结果⑴,有的C++系统则给出结果⑵。多数编译系统采取“向零取整”的方法,即5/3的值等于1,⑸/3的值等于⑴,取整后向零靠拢。
如果参加+, -, *, / 运算的两个数中有1个数为float型数据,则运算的结果是double型,由于C++在运算时对所有float型数据都按double型数据处理。
算术表达式和运算符的优先级与结合性
用算术运算符和括号将运算对象(也称操作数)连接起来的、符合C++语法规则的式子,称C++算术表达式。运算对象包括常量、变量、函数等。例如,下面是1个合法的C++算术表达式:
a*b/c⑴.5+'a'
C++语言规定了运算符的优先级和结合性。在求解表达式时,先按运算符的优先级别高低次序履行,例如先乘除后加减。如有表达式a-b*c,b的左边为减号,右边为乘号,而乘号优先于减号,因此,相当于a-(b*c)。如果在1个运算对象两侧的运算符的优先级别相同,如a-b+c,则按规定的“结合方向”处理。
C++规定了各种运算符的结合方向(结合性),算术运算符的结合方向为“自左至右”,即先左后右,因此b先与减号结合,履行a-b的运算,再履行加c的运算。“自左至右的结合方向”又称“左结合性”,即运算对象先与左面的运算符结合。以后可以看到有些运算符的结合方向为“自右至左”,即右结合性(例如赋值运算符)。关于“结合性”的概念在其他1些高级语言中是没有的,是C和C++的特点之1,希望能弄清楚。
C++所有运算符和它们的优先级别和结合性请查看这里:C++运算符优先级表
表达式中各类数值型数据间的混合运算
在表达式中常遇到不同类型数据之间进行运算,如:
10+'a'+1.5⑻765.1234*'b'
在进行运算时,不同类型的数据要先转换成同1类型,然落后行运算。转换的规则按图2.7所示。
图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型。
上述的类型转换是由系统自动进行的。
C++自增和自减运算符(--和++)
在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。
正确地使用++和--,可使程序简洁?清晰?高效。请注意:
- 自增运算符(++)和自减运算符(--)只能用于变量,而不能用于常量或表达式。
- ++和--的结合方向是“自右至左”。
- 自增运算符(++)和自减运算符(--)使用10分灵活,但在很多情况下可能出现歧义性,产生“意想不到”的副作用。
- 自增(减)运算符在C++程序中是常常见到的,经常使用于循环语句中,使循环变量自动加1。也用于指针变量,使指针指向下1个地址。
C++强迫类型转换
在表达式中不同类型的数据会自动地转换类型,以进行运算。有时程序编制者还可以利用强迫类型转换运算符将1个表达式转换成所需类型。例如:
(double)a (将a转换成double类型)
(int)(x+y) (将x+y的值转换成整型)
(float)(5%3) (将5%3的值转换成float型)
强迫类型转换的1般情势为:
(类型名)(表达式)
注意:如果要进行强迫类型转换的对象是1个变量,该变量可以不用括号括起来。如果要进行强迫类型转换的对象是1个包括多项的表达式,则表达式应当用括号括起来。如果写成
(int)x+y
则只将x转换成整型,然后与y相加。
以上强迫类型转换的情势是原来C语言使用的情势,C++把它保存了下来,以利于兼容。C++还增加了以下情势:
类型名(表达式)
如
int(x)
或
int(x+y)
类型名不加括号,而变量或表达式用括号括起来。这类情势类似于函数调用。但许多人仍习惯于用第1种情势,把类型名包在括号内,这样比较清楚。
需要说明的是在强迫类型转换时,得到1个所需类型的中间变量,但原来变量的类型未产生变化。例如:
(int)x
如果x原指定为float型,值为3.6,进行强迫类型运算后得到1个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。
由上可知,有两种类型转换,1种是在运算时没必要用户指定,系统自动进行的类型转换,如3+6.5。第2种是强迫类型转换。当自动类型转换不能实现目的时,可以用强迫类型转换。另外,在函数调用时,有时为了使实参与形参类型1致,可以用强迫类型转换运算符得到1个所需类型的参数。
C++赋值运算符与赋值表达式
赋值运算符
赋值符号“=”就是赋值运算符,它的作用是将1个数据赋给1个变量。如“a=3”的作用是履行1次赋值操作(或称赋值运算)。把常量3赋给变量a。也能够将1个表达式的值赋给1个变量。
赋值进程中的类型转换
如果赋值运算符两侧的类型不1致,但都是数值型或字符型时,在赋值时会自动进行类型转换。
1) 将浮点型数据(包括单、双精度)赋给整型变量时,舍弃其小数部份。
2) 将整型数据赋给浮点型变量时,数值不变,但以指数情势存储到变量中。
3) 将1个double型数据赋给float变量时,要注意数值范围不能溢出。
4) 字符型数据赋给整型变量,将字符的ASCII码赋给整型变量。
5) 将1个int、short或long型数据赋给1个char型变量,只将其低8位原封不动地送到char型变量(产生截断)。例如
short int i=289;
char c;
c=i; //将1个int型数据赋给1个char型变量
赋值情况见图2.8。为方便起见,以1个int型数据占两个字节(16位)的情况来讲明。
图2.8
6) 将signed(有符号)型数据赋给长度相同的unsigned(无符号)型变量,将存储单元内容原样照搬(连原本的符号位也作为数值1起传送)。
<
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
------分隔线----------------------------
------分隔线----------------------------