标签:
第4章 表达式
表达式是运算对象及运算符组成的式子,表达式求值将得到一个结果,单独的变量或者字面值也算表达式,结果是其本身。
运算符分为:一元运算符、二元运算符、三元运算符。一元即一个作用对象,二元两个作用对象,以此类推。函数调用是一种特殊的运算符(此运算符无作用对象数量限制)
表达式的关键点:优先级、结合律、求值顺序。
左值和右值:这两个名词是从C语言中继承得到的,在C++中,当一个对象被用作右值时,使用的是它的值(内容),当对象被用作左值的时候,用的是它的身份(在内存中的位置)。通俗来理解的话,例如
int a=5;//这句代码声明定义了一个int变量,变量值为5,其执行的动作是在内存中划出地址为0x7fff0444—0x7fff0447这4个字节来存储int变量a,并且存储了一个二进制的5(101)
当a被用作右值时,例如
int b=a;//这里a放在右侧,使用了a的右值,即a的值5,因此b=5。
而当给变量a赋值时,形如
a=7;//这时a放在左侧,被用作左值,使用的不再是它的值了,使用的是它的身份,即使用这个地址0x7fff0444—0x7fff0447。
以上int大小和内存地址都是为说明而假定的。
不同的运算符在表达式中的行为表现和返回值各不相同,有的要求左侧运算对象,有的要求右侧运算对象,例如取地址符&,要求右侧运算对象,即对象在右边:&a;(取变量a的地址),而后置递增++则要求运算对象在左边:p++。返回值也有差异,有的返回左值,有的返回右值。哪些返回左值,哪些返回右值,需要自己留心一下,大部分返回的都是右值。
左值可以当左值用,也可以当右值用,但是右值只能用作右值。
运算符不仅要求左侧或右侧运算对象,也会要求左值对象或者右值对象,比如赋值运算符“=”,它的要求是左侧必须是左值,右侧左值和右值皆可,运算完毕后返回一个左值。
复合表达式则是含有多个运算符的组合,在含有多个运算符和运算对象时,具体要视结合情况、优先级以及先后顺序综合而定。
关于优先级、结合律、求值顺序的具体内容是延续于基本数学的,因此在此不再赘述。
额外说明一点:当优先级相同时,有些表达式求值顺序不一定,此时产生的结果也就不确定了,对于这种情况一定要予以避免。
例如对几个函数进行运算:f( )+g( )*f( )+g( ),当f( )和g( )同时对一个全局变量作出改变时,就有可能导致不确定的结果。
标签:
原文地址:http://www.cnblogs.com/pluse/p/5106696.html