表达式
表达式是由运算符和操作数组成的符合C++语法规则的式子,其目的是用来说明一个计算过程。表达式中的操作数包括常量、变量和函数等。所有的表达式都有一个值,即返回结果。本节将介绍算术运算符、赋值运算符、关系运算符、逻辑运算符、逗号运算符、位运算符以及由它们所构成的相应的表达式。
在书写表达式时,应注意运算符的优先级别与结合性,确保列出的表达式的实际求值顺序和自己所要求的一致。必要时可加上括号加以理解,括号的使用可以嵌套。例如:5-2*4+(3*sizeof(int))/。
在书写表达式时,还要注意当在表达式中连续出现两个运算符时,最好用空格隔开。例如:
i++ + j--
这样便于提高C++源程序代码的可读性。
算术运算符和算术表达式
算术运算符和算术表达式
1)基本算术运算符
+ 加法运算符,或正值运算符
- 减法运算符,或负值运算符
* 乘法运算符
/ 除法运算符
% 求余运算符(求模运算符)
加、减、乘、除、求余运算符是双目运算符(又称为二元运算符),它要求有两个操作对象(操作数);正值、负值运算符是单目运算符(又称为一元运算符),只需要一个操作对象(操作数)。
进行除法与取余运算时,运算对象的数据类型和运算结果的数据类型之间的关系如下:
(1)除法运算(/)时,两个整型数相除的结果为整型数,即整除。例如:
3/4 ∥结果为0
5/2 ∥结果为2
超实用性的Python零基础入门到进阶视频源码淘宝¥2购买已下架(2)求余运算(%)时,要求两个运算对象均为整数类型或字符型,运算结果也是整型。例如:
3%4 ∥结果为3
5%2 ∥结果为1
3.4%2 ∥错误,有一个操作数不是整数类型,不允许这种形式
′a′%′b′ ∥′a′对应的整数为97,′b′对应的整数为98,结果为97
′a′%3 ∥结果为1
(3)除法运算(/)时,若参与运算的两个运算对象中有一个为实型,另一个为整型,则运算结果是双精度型。例如:
3.0/4 ∥结果为双精度数0.75
5.0/2 ∥结果为2.5
2)算术表达式
用算术运算符和括号将运算对象连接起来的,符合C++语法规则的式子,称为C++的算术表达式。其表达式的值是一个数值,表达式的类型由运算符和操作共同确定。运算对象可以是常量、变量或函数等。例如:
分析下列程序中算术表达式的运算结果。程序文件名为example2_2.cpp。
分析:对于上面例题中的算术表达式,需要根据算术运算符的优先级和结合性来解决问题。
(1)算术运算符的优先级和结合性
①算术运算符的优先级
在对表达式求值时,如果表达式中包含多个运算符,则应按运算符的优先级从高到低依次执行。
在算术运算符中,正值与负值运算符优先级最高,然后按先乘除后加减的优先级次序,即“*”、“/”、“%”优先级高于“+”、“-”。例如:
a-b*c ∥先进行*运算,再进行-运算
可使用括号改变运算符的优先级,先计算括号内的值,再计算括号外的值。
②算术运算符的结合性
在对表达式求值时,如果在一个运算对象两侧的运算符优先级相同,则按规定的运算符的结合性处理。运算符的结合性即“结合方向”,C++语言规定了各种运算符的结合性。
结合性分为两种:
左结合性。“从左到右的结合方向”又称左结合性,即运算对象先与左面的运算符结合,也就是从左到右运算。
右结合性。“从右到左的结合方向”又称右结合性,即运算对象先与右面的运算符结合,也就是从右到左运算。
算术运算符的结合性为:左结合(即从左到右结合),例如:
a*b/c ∥先进行*运算,再进行/运算
(2)不同类型数据混合运算时的数据类型的转换
整型、实型、双精度型、字符型数据可以进行混合运算。例如:
10+′a′+1.5-.*′b′
在进行运算时,不同类型的运算对象要先转换成同一类型,然后再进行运算。数据类型的转换有两种方式:自动的类型转换和强制的类型转换。
①自动的类型转换
当一个表达式中的操作数类型不一致时,即有几种不同类型的数据在一起参与运算,编译系统会自动进行类型转换,转换规则为由低到高进行转换。具体的转换规则如图2.3所示。
图2.3 数据类型自动转换
图中,横向向左的箭头表示运算时必定的转换,float型数据自动转换为double型,char和short型数据自动转换成int型。
纵向向上的箭头表示当运算对象为不同类型时转换的方向,例如,当一个long型的操作数和一个double型的操作数进行运算时,则long型会自动转换成double型。
注意:箭头的方向只表示数据类型级别的高低,由低向高转换。不要理解为int型先转换成unsigned型,再转换成long型,再转换成double型。而且,自动类型转换是由编译系统自动完成的,它实际上并不改变操作数的数据类型,只是在计算表达式值的时候临时改变操作数的数据类型,计算完成后,操作数仍保持原来的数据类型。
通过对以上知识的学习,可以得出例2.2的运行结果,如图2.4所示。
图2.4 的运行结果
再看一例:
分析下列程序中算术表达式的运算结果。程序文件名为example2_
3.cpp。
分析:上述程序中表达式的求值过程为:先将字符′a′转换成整型数97,完成10+97的运算,运算结果为整型数,设其值为t1;将i和f都转换成双精度型数,完成i*f的运算,运算结果为双精度型数,设其值为t2;将t1转换成双精度型数,完成t1+t2的运算,运算结果为双精度型数,设其值为t3;将e转换成双精度型数,完成d/e的运算,运算结果为双精度型数,设其值为t4;完成t3-t4的运算。表达式的最后运算结果为双精度型数。
例2.3的运行结果如图2.5所示。
图2.5 的运行结果
②强制的类型转换
强制的类型转换的格式为:
(<数据类型>)<表达式>
或:
<数据类型>(<表达式>)
强制类型运算符也是一种一元运算符,表示先求出表达式的值,然后由系统强制性地将该值的类型转换为由数据类型名所指定的数据类型。例如,有说明语句inta;floatx,y;,则:
(double)a ∥将整型变量a的值强制转换成双精度型
int(x+y) ∥将实型变量x、y的和强制转换成整型
(int)x%(int)y ∥将实型变量x、y的值转换成整型后作求余(%)运算
上述的强制类型转换也是在运算时对转换对象的运算值进行转换,而该对象在存储单元中的内容和类型并没有改变。
注意:如果在强制类型转换过程中出现将高类型转换成低类型的情形时,将造成数据精度的损失。因此,在这种情况下是一种不安全的类型转换,应多加注意。
混合运算时的两种类型转换,第一种自动类型转换在运算时不必由用户指定,系统自动进行类型转换;第二种强制类型转换在运算时必须由用户指定,当自动类型转换不能完成相应的运算时,可使用强制类型转换。强制类型转换的优先级高于基本算术运算。
下面通过一个例题来加深对类型转换的理解。
分析下列程序中算术表达式的运算结果。程序文件名为example2_4.cpp。
分析:按照运算的优先级别,应先运算(float)m,结果为浮点型数据2.0,然后运算括号内的数据(2.0+n),此时,由于float型与int型在一起运算,会自动进行转换,结果为float型5.0,最后运算5.0/2,结果为float型2.5。
例2.4的运行结果如图2.6所示。
图2.6 的运行结果
3)自增、自减运算符
在C++中,提供了两个变量的自增和自减运算符:
++ 自增运算符,使变量的值加1
-- 自减运算符,使变量的值减1
自增、自减运算符为单目运算符,只需要一个操作对象。
自增、自减运算符有前置和后置两种形式:
前置运算为先自加(或自减)后引用,例如:
++i或--i ∥表示在使用i之前先使i加1或减1
后置运算为先引用后自加(或自减),例如:
i++或i-- ∥表示使用i之后再使i加1或减1
例如:
inti=3,j=3,m,n;
m=++i; ∥先将变量i自加为4,然后将自加后的值4赋给m
n=j++; ∥先将变量j的值3赋给变量n,然后将j自加为4
则以上代码行运行完成后,m的值为4,i的值为4,n的值为3,j的值为4。
注意:自增运算符(++)和自减运算符(--)的运算对象只能是变量,不能为常量和表达式,且变量的数据类型通常为整型;自增运算符(++)和自减运算符(--)的优先级高于基本算术运算符,与正负值运算符(+,-)相同。
好了,本文到此结束。如果对编程、计算机、程序员方面感兴趣的话,欢迎私信联系我,随时交流!点个