2.4C++的运算符和表达式
运算符是施加在数据上的重要操作,变量、常量通过操作符组合成C++的表达式,构成了C++程序的基本要素。
本节将介绍C++语言中基本运算符和表达式。
2.4.1C++中的基本运算符
运算是对数据的加工过程,而标识不同运算的符号称职运算符,参与运算的数据称为操作数。
表2.3列出了C++中的基本运算符、其优先级及对操作数的结合性。
注:优先级相同的运算符,其执行顺序由该运算符在语句中的位置先后决定。
根据参与运算的操作数的类型不同,运算符可以分为单目运算符(1个操作数)、双目运算符(2个操作数)、三目运算符(3个操作数)。
有一些运算符既可以是单目的,也可以是双目的,根据赋予该运算符的操作数的不同,运算符具有不同的功能。
例如:*pFile; var1*var2;
运算符的优先级和数学运算中的优先级意义相同,它决定了一个操作符在表达式的运算顺序,优先级越高,运算次序越靠前。
而结合性则决定一个操作符对其操作数的运算顺序。
如果一个操作符对其操作数的操作运算是自左向右执行的,则称该操作符是右结合的;反之如果一个操作符对其操作数的操作运算是自右向左执行的,则称该操作符是左结合实际的。
根据操作符表示的运算的性质不同,可以将C++中的操作符分为算术运算、关系运算符、逻辑运算符、赋值运算符、条件运算符、自增自减运算符、位运算符和sizeof运算符等。
下面分别进行讨论。
1、算术运算符
表2.4列出了C++中的算术运算符。
对于单目运算符-,其返回值的数据类型与操作数的数据类型相同.对于双目运算符+、-、*和/,若其两个操作数的数据类型相同,则返回值的数据类型与操作数的数据类型相同;若两操作数的数据类型不同,则返回值的数据类型与字长较长的操作数的数据类型相同。
注意:两个整数相除的结果仍然是整数。
若被除数不能被除数整除,则相除的结果将被取整,其小数部分将被略去。
例如:34/7;12.5%3(非法)35%7
在某些情况下,算术运算表达式会产生某些问题,计算的结果将给出错误或没有定义的数值,这些情况称为运算异常。
对不同的运算异常,将产生不同的后果。
在C++中,除数为零和实数溢出被视为一个严重的错误而导致程序运行的异常终止。
而整数溢出则不被认为是一个错误(尽管其运算结果有可能与预期值不同)。
因此,在一些与硬件打交道的低级程序中利用整数溢出查看设备的状态位等。
2、关系运算符
表2.5列出了C++中的关系运算符,它们都是双目运算符。
关系运算符的返回值只有逻辑真和逻辑假两种。
当两个操作数满足关系运算符所要求的比较关系时,返回整型数1(真);否则返回整型数0(假)。
表2.5 C++中的关系运算符
var3=(var1<var2)+6; //结果为7
注意:(1)、关系运算符的两个操作数可以是任何基本数据类型。
(2)、在进行相等及不相等关系关系运算时,除了两个操作数都有是整型数之外,由于计算机的存储方式及计算误差,运算结果常常会与预期结果相反。
因此,在比较两个实数(浮点数或双精度型)相等或不等时,常用判断这两个操作数的差值的绝对值小于或大于某一给定的小数值来代替(可靠性高一些)。
3、逻辑运算符
表2.6列出了C++中的逻辑运算符,逻辑运算符用来表示操作数的逻辑关系,其运算结果是整型数1或0。
逻辑运算的结果也可以作为一个整型数用在算术运算中。
注意:在C++中,0被看作逻辑假,而其他的非零值(任意基本数据类型)均被视为逻辑真。
4、赋值运算符
赋值运算符“=”将左边的变量值或表达式的值赋给左边的变量,其结果是将一个新的数值存放在左操作数所占用的内存单元中。
赋值运算也有返回值,该返回值的数值是右操作数的数值,而其数据类型则与左操作数的数据类型相同。
同时,赋值运算的运算次序是从右到左进行的。
所以采用多个赋值运算符可以将多个操作数连接起来,其运算结果是将表达式最右端的操作数的值赋给其左边的各个操作数。
例如:var1=var2=var3=var4=21;
赋值操作符可以与某些算术操作符、关系操作符或位操作符进行复合,产生一个新的双目操作符,其功能是将该操作符的左、右操作数分别作为相应的算术操作符、关系操作符或位操作符的左、右操作数进行相应的算术、比较或位操作,再将运算的结果赋给复合操作符的左操作数。
在C++中可以使用的10种复合操作符,具体如下:
+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=。
例如:var1+=var2; 等价var1=var1+var2;
5、条件运算符
条件运算符是C++中唯一的三目运算符,它的使用较为灵活,在某些情况下可以用来代替if—else语句。
条件运算符的语法形式如下:
expr1?expr2:expr3;
根据expr1计算的结果决定计算expr2(结果非0)或expr3(结果为0)。
整个表达式的最终返回结果由表达式expr2或expr3决定。
例如:5>6?x=5:x=8;
6、自增、自减运算符
自增运算符“++”和自减运算符“――”主要用在循环语句中,为循环控制变量提供格式紧缩的加1和减1运算。
例如:i++; 等价于i=i+1;
自增和自减运算符对其操作数都进行赋值,且每种运算符都有前缀和后缀两种用法。
当使用前缀用法(例如++i)时,程序首先对该操作数进行引用,再对其进行加1或减1用赋值;当使用后缀用法(例如i++)时,程序首先对操作数进行加1或减1及赋值,再对该操作数进行引用。
[例2.9] 自增、自减运算符及其不同用法举例
//EX2_9.cpp
//自增、自减操作符及其不同用法
#include<iostream.h>
void main()
{
int var1,var2;
var1=10;
cout<<"var1="<<var1<<'\n';
var2=var1++;
cout<<"var1++="<<var1<<'\n';
cout<<"var2=var1++="<<var2<<'\n';
cout<<"\n\n\n";
var1=10;
cout<<"var1="<<var1<<'\n';
var2=++var1;
cout<<"++var1="<<var1<<'\n';
cout<<"var2="<<var2<<'\n';
cout<<"\n\n\n";
var1=10;
cout<<"var1="<<var1<<'\n';
var2=var1--;
cout<<"var1--="<<var1<<'\n';
cout<<"var2=var1--="<<var2<<'\n';
cout<<"\n\n\n";
var1=10;
cout<<"var1="<<var1<<'\n';
var2=--var1;
cout<<"--var1="<<var1<<'\n';
cout<<"var2="<<var2<<'\n';
}。