C++第十天 2016-12-09 3.6-4.1

来源:互联网 发布:网络管理控制软件 编辑:程序博客网 时间:2024/06/16 02:59

 

 

    重要 第三章小结

    Stringvector是两种最重要的标准库容器,String对象是一个可以变长的祖字符序列,vector是一组同类型的容器。

    迭代器允许对容器中的对象进行间接访问,Stringvector可以通过迭代器访问元素或者在元素间移动

    第四章表达式

    表达式由一个或多个运算对象(operand)组成,对表达式求值得到一个结果(result)。字面值和变量是最简单的表达式(expression),使用运算符(operator)和一个或多个运算符对象组合起来可以生成比较复杂的表达式。

    4.1基础

    4.1.1基本概念

     C++定义了一元运算符(unary operator)和二元运算符(binary operator)。作用于一个或两个运算对象。一元:取地址符(&)、解引用符(*);二元:相等运算符(==)、乘法运算符(*)。

    重要 组合运算符和运算对象

    理解多个运算符的复杂表达式,理解运算符的优先级(precedence)、结合律(associativity)和运算对象的求值顺序(order of evaluation

    5+ 10* 20/2;

    重要 运算对象转换

    在运算的时候,一般要求两边是同一个类型,但是即使不相同,只要他们能够转换为同一种对象就可以进行运算。转换时,浮点和整型可以互相转换,但是小整型在转换中会被提升(promoted),如bool -> int

    重要 重载运算符

    当运算符作用于类类型的运算对象时候,可以自行定义含义,事实上就是为已存在的运算符赋予了另外一层含义。所以称作重载运算符(overloaded),使用重载运算符时,可以定义运算对象和返回值类型,但是运算对象个数和运算符优先级数,结合律是无法改变的。

    重要 左值和右值

    右值(rvalue)、左值(lvalue),C语言中:左值可以位于赋值语句的左侧,右值则不能。

    但是在C++语言中,左值表达式的求值结果是一个对象或者一个函数。当一个对象被用作右值的时候,用的是对象的值(内容);当对象被用作左值的时候,用的是对象的身份(内存中的位置)。

    一个原则:需要右值的对象可以用左值代替,但是反之不可以。

    使用decltype时候,左值和右值有所不同,如果求值结果是左值,decltype作用得到一个引用类型

    int *p;  decltype(*p)得到的是int&decltype(&p)结果是int**。指向整型指针的指针。

    4.1.2优先级和结合律

    符合表达式(compound expression)是指含有两个或多个运算符的表达式。表达式的值依赖于子表达式的结合方式。高优先级运算符的运算对象比低优先级运算符的对象更为紧密地组合在一起。乘法除法优先级大于加减法。先执行乘除再加减。

    + 3* 4 / 2 +2 =14

    重要 括号无视优先级与结合律

    cout << (6 + 3) * (4 / 2 + 2) endl; cout ((6 + 3) * 4) / 2 + 2 endl,• cout 6 + 3 * 4 / (2 + 2) endl; 36 20 9

    重要 优先级与结合律有何影响

    int int last — last = last 8, — 4, ia[01 +4 last

    运算级相同的时候,越靠前优先级越高

    4.1.3求值顺序

    优先级规定了运算对象的组合方式,并未说明对象按什么顺序求值

    int I = f1() * f2();

    我们知道f1f2一定会在执行乘法之前被调用。但不知道f1f2调用的先后顺序。

    对于没有指定顺序的运算符,如果表达式指向并修改了同一个对象,将会引发错误并产生未定义行为

    cout << I << "" << ++I <<endl; //未定义的不知道这个输出结果可能是1 1,或01,但是不管是什么,都是错误的

    重要 有四种运算符规定了运算对象的求值顺序。1、逻辑与(&&)规定先求左侧运算对象,只有左侧为真才继续。其它是逻辑或(||)、条件(?:)、逗号(,)运算符。

    重要 求值顺序、优先级、结合律

    求值顺序与优先级和结合律无关,形如f()+g()*h()+j()

    优先级规定g()和f()返回值相乘

    结合律规定从左往右计算

    对于这些函数调用顺序没有明确规定。

    如果fghj函数无关,则调用顺序无所谓,但是如果是相关的,则会报错。

    在拿不准的时候最好用括号来强制让表达式的组合关系符合程序逻辑要求。

    如果改变了某个运算对象的值时候,在表达式的其他地方不要再用这个运算对象。

 

练习4.2 *(vec).begin();

 

0 0
原创粉丝点击