C++基础编程----4.1表达式

表达式

1.定义

           表达式是由一个或多个运算对象组成,对表达式求值将得到一个结果。字面值和变量是最简单的表达式,其结果就是字面值和变量的值。将运算符和多个运算对象组合起来构成复杂的表达式。

2.基本概念

           2.1 函数调用是个复杂的运算符,它对运算对象的数量没有限制。

           2.2 使用重载运算符,运算对象类型和返回值都是由该运算符定义的,但是对于运算对象的个数、运算符优先级和结合律都是无法改变的。

           2.3 左值和右值

                          2.3.1C++表达式要不就是左值,要不就是右值,在C语言中,为了帮助大家记忆:左值可以位于赋值语句的左侧,而右值只能位于赋值语句的右侧。

                          2.3.2 在C++里面就没有那么简单了,左值表达式的求值结果是一个对象,然而常量对象代表的某些左值不能位于赋值运算符的左侧运算对象。可以简单地归纳:当一个对象被用作右值的时候,用的是对象的值,当对象被用作左值的时候,用的是该对象在内存中的位置。

                          2.3.3 解引用运算符、下标运算符作用于左值运算对象都是左值

                          2.3.4 递增递减运算符其前置版本是个左值,后置版本是个右值,不能当做左值进行使用。-----不推荐将自增自减运算符和其他运算符混合使用

           2.4 decltype类型

                          左值右值是不同的,如果表达式的求值结果是个左值,decltype作用于表达式(不是变量)得到引用类型,例如,p的类型是int * ,因为解引用运算符生成的是左值,所以decltype(*p)为int &,因为取地址运算符生成的是右值,decltype(&p)的结果是int **。

3.优先级和结合律

          3.1  括号无视优先级,也就是说,在不确定的情况下,就加括号进行运算

          3.2   优先级表格需要看下

4.求值顺序

          4.1  int  i=0;    cout<<i<<"  "<<++i<<endl;     //  错误   可能出结果,但不同编译器可能处理不同

                  如果表达式指向并修改了同一个对象,将会引发错误并产生未定义的行为。cout<<i<<"   "<<++i<<endl;    因为程序是未定义的,<<运算符没有明确规定何时对运算对象求值,是从前往后还是从后往前没定义,编译器可能先求++i再求i,也可能先求i再求++i。

          4.2  有4种运算符明确规定了运算顺序,(1)逻辑与(&&),只有左侧为真才进行右侧运算(2)逻辑或(||),只有左侧为假才进行右侧运算(3)条件运算符(?:)(4)逗号运算符(,)从左向右进行求值。

           4.3  *++iter的用法已经很常见了。

你可能感兴趣的:(表达式)