国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > 互联网 > C++(二):运算符与表达式

C++(二):运算符与表达式

来源:程序员人生   发布时间:2014-11-14 08:15:46 阅读次数:2963次

C++的运算符

C++的运算符10分丰富,使得C++的运算10分灵活方便。例如把赋值号(=)也作为运算符处理,这样,a=b=c=4就是合法的表达式,这是与其他语言不同的。C++提供了以下运算符:

  1. 算术运算符
    +(加)  -(减)  *(乘)  /(除)  %(整除求余)  ++(自加)  --(自减)
  2. 关系运算符
    >(大于)  <(小于)   ==(等于)  >=(大于或等于)  <=(小于或等于)  !=(不等于)
  3. 逻辑运算符
    &&(逻辑与)  ||(逻辑或)   !(逻辑非)
  4. 位运算符
    <<(按位左移)  >>(按位右移)  &(按位与)  |(按位或)   ^(按位异或)  ~(按位取反)
  5. 赋值运算符 (=及其扩大赋值运算符)
  6. 条件运算符 (?:)
  7. 逗号运算符 (,)
  8. 指针运算符 (*)
  9. 援用运算符和地址运算符 (&)
  10. 求字节数运算符(sizeof)
  11. 强迫类型转换运算符( (类型) 或类型( ))
  12. 成员运算符 (.)
  13. 指向成员的运算符 (->)
  14. 下标运算符 ([ ])
  15. 其他 (如函数调用运算符())

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
运算次序为:
  1. 进行10+'a'的运算,先将'a'转换成整数97,运算结果为107。
  2. 进行i*f的运算。先将i与f都转换成double型,运算结果为double型。
  3. 整数107与i*f的积相加。先将整数107转换成双精度数(小数点后加若干个0,即107.000…00),结果为double型。
  4. 将变量e转换成double型,d/e结果为double型。
  5. 将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。

正确地使用++和--,可使程序简洁?清晰?高效。请注意:
  1. 自增运算符(++)和自减运算符(--)只能用于变量,而不能用于常量或表达式。
  2. ++和--的结合方向是“自右至左”。
  3. 自增运算符(++)和自减运算符(--)使用10分灵活,但在很多情况下可能出现歧义性,产生“意想不到”的副作用。
  4. 自增(减)运算符在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起传送)。

<
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生