第5章 表达式
【36】5.4定义术语“溢出“的含义,并给出导致溢出的三个表达式
答:溢出即表达式的求值结果超出了其类型的表示范围。
如下表达式会导致溢出(假设int类型为16位:-32768~32767):
2000*1000
32766+5
3276*20
【37】5.5解释逻辑与操作符、逻辑或操作符以及相等操作符的操作数在什么时候计算。
答:逻辑与、或操作符采用称为“短路求值“的求值策略,即先计算左操作数,再计算右操作数,且只有当仅靠左操作数的值无法确定该逻辑运算的结果时,才会计算右操作数。
相等操作符的左右操作数均需进行计算。
【38】5.9假设有下面两个定义:
unsignedlong ul1=3,ul2=7;
下列表达式的结果是什么:
a)ul1&ul2 :3
b)ul1&&ul2 :true
c)ul1|ul2:7
d)ul1||ul2:true
【39】5.19假设iter为vector<string>::iterator类型的变量,指出下面哪些表达式是合法的,并解释这些合法表达式的行为。
a)*iter++;合法,返回iter所指向的string对象,并使iter加1
b)(*iter)++;不合法
c)*iter.empty();不合法
d)iter->empty();合法,调用iter所指向的string对象的成员函数empty
e)++*iter;不合法
f)iter++->empty();调用iter所指向的string对象的成员函数empty,并使iter加1.
【40】5.33给定下列定义
intival;
doubledval;
conststring *ps;
char*pc;
void*pv;
用命名的强制类型转换符号重写下列语句:
a)pv=(void*)ps;
b)ival=int(*pc);
c)pv=&dval;
d)pc=(char*)pv;
答:a)pv=static_cast<void*>(const_cast<string*>(ps));
b)ival=static_cast<int>(*pc);
c)pv=static_cast<void*>(&dval);
d)pc=static_cast<char*>(pv);