C++ Primer第四章学习笔记

    技术2022-07-11  128

    C++ Primer第四章表达式

    4.1 基础4.1.1 基本概念4.1.2 优先级与结合律4.1.3 求值顺序4.3 逻辑和关系运算符4.4 赋值运算符4.5 递增和递减运算符4.6 成员访问运算符4.7 条件运算符4.8 位运算符4.9 sizeof运算符4.10 逗号运算符4.11 类型转换4.11.2 其他隐式类型转换

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

    4.1 基础

    4.1.1 基本概念

    重要原则:在需要右值的地方可以用左值来代替,但是不能把右值当做左值。当一个左值被当做右值使用时,实际使用的是它的内容。

    4.1.2 优先级与结合律

    答:105

    答:(vec.begin()) ((vec.begin())) + 1

    4.1.3 求值顺序

    优先级规定了运算对象的组合方式,但是没有说明运算对象按照什么顺序求值。

    处理复合表达式

    答:91

    答:-86;;-18;0;-2

    答:int val = 45; if(val%2 == 0)

    答:溢出是指要存放的数超过类型所能表示的最大范围; short i = 60000;

    4.3 逻辑和关系运算符

    答:对于逻辑与,先计算左边对象值,如果为false,则不会算右边;如果为true才会再计算右边;对于逻辑或,先计算左边,如果为true,不会计算右边;如果为false则继续计算右边;对于相等性符号,左右两边都会计算,顺序不区分先后,在判断是否相等

    答:先判断cp是不是空指针,发现不是空指针,继续判断cp指向的对象是否为空字符’\0’,发现不是,所以if条件判断为真,执行以下语句

    答:int i = 0; while(cin >> i && i != 42){

    }

    答:if(a>b && b>c && c>d)

    答:<、<= > >=的优先级要高于== !=,因此表达式的意思是先比较j<k是否为真,如果为真,比较i!=1是否为真,如果为假,则比较i!=0是否为真

    4.4 赋值运算符

    答:(a) i = 3, d = 3 (b)d=3.5 i=3

    答:第一条错误,第二条if的条件一直为true

    答:pi是指针类型,不可以直接赋值给int类型的ival,正确应该改为: dval=ival=*pi=0; 或者另外一种含义 dval = ival = 0; pi = 0

    答:(a)因为!=的优先级高于=,所以会先执行getPtr() != 0,判断真假,如果为真,则执行p=1,如果为假执行p=0,显然不符合本来的意义,应该改为if((p=getPtr()) != 0) (b) i=1024会执行赋值操作,然后返回i,因为i是1024不是0,因此条件一直为真,正确应该改为if(i == 1024)

    4.5 递增和递减运算符

    答:前置递增运算符和后置递增运算符都让对象加1后赋值给对象,区别是他们的返回值,前置递增返回的是对象加1之后的对象,后置递增返回的是对象加1之前的副本

    答:首先是vector的第一个元素将不会输出,更严重的是,如果vector中元素没有负值,移动到最后一个元素的地方,程序试图继续向前移动迭代器并解引用一个根本不存在的元素。

    答:(a)含义是ptr不为空指针,而且ptr指向的对象不为0,之后ptr加1 (b) 由于++的优先级高于&&,ival会先自身加1,然后返回ival没加1之前的副本,之后判断副本是否为0,如果为0,语句为false,如果不为0,继续判断右边,也就是ival加1之后是否为0,如果为0,则语句为false,如果不为0,则语句为true。实际上ival和ival+1不可能同时为0,因此语句一定是true的,正确的话应该改为ival && ival+1

    注意:二元运算符的两个运算对象涉及同一个对象并改变对象值的情况应该尽量避免

    4.6 成员访问运算符

    答:(a)合法,含义是解引用当前迭代器所处的位置的对象内容,然后把迭代器的位置往后移动一位 (b)不合法,iter对应字符串对象,不可以执行后置自增操作 © 错误,因为.的优先级高于解引用符号,所以这条语句等价于(iter.empty()) ,但是iter是迭代器,没有empty()的成员函数,正确的话应该改变为(*iter).empty() (d) 正确,相当于(*iter).empty() (e) 错误,相当于++(*iter),当时字符串没有自增操作,所以错误 (f) 正确,相当于先调用iter->empty(),之后++iter

    4.7 条件运算符

    答:优先级顺序为:加法运算符、相等运算符、条件运算符、赋值运算符 应该改为 string s = “word”; string p1 = s + (s[s.size()-1] == ‘s’ ? “” : “s”);

    4.8 位运算符

    答:~优先级高于<<,C++里面带符号整数类型(例如int)对负数的二进制存储是用补码进行的.对补码的解释一般是"对负数的绝对值按位取反再+1".

    答:(a) 3 (b)7 © true (d) true

    4.9 sizeof运算符

    答:10 2

    答:(a) sizeof(x + y) (b) sizeof p->mem[i] ©sizeof(a<b) (d)sizeof f()

    4.10 逗号运算符

    一样的

    答:循环5次,ix每次迭代加1,取值范围为0-4,ptr每次迭代指向数组的下一个元素

    答:若someValue为true,则执行++x,++y; 若someValue为false,执行–x, --y;

    4.11 类型转换

    答:(a)fval如果为0,则转化为false,否则转换为true (b)ival先转换成float,再与fval相加,然后转换成double类型赋值给dval © 首先cval提升为int类型,然后与ival相乘,然后结果转换成double类型,再与dval相加

    答:(a) 'a’先转换成int类型,与3相加后的结果在转换成char类型 (b)ival先转换成double类型,与1.0的相乘,然后ui转换成double类型,然后与前面的结果相乘,最后转换成float类型赋值给fval ©ui先转换成float,与fval相乘后结果转换成double类型并进行赋值 (d) ival先转换成float类型与fval相加,结果又转换成double类型,再与dval相加,最终将结果转换成char类型

    4.11.2 其他隐式类型转换

    Processed: 0.036, SQL: 9