4.1 先乘除后加减,105
4.2
a)*(vec.begin())
b)(*(vec.begin()))+1
4.3
可以接受,可以提高编译器效率,潜在缺陷只要注意不让表达式指向并修改同一对象就可以忽略
4.4
((12/3)*4)+(5*15)+((24%4)/2)=91
4.5
a)-86
b)-18
c)0
d)-2
4.6
if(ival%2)为真时奇数,为假时偶数
4.7
当计算的结果超出该类型的范围就会溢出;
4.8
逻辑与,仅当左侧为真时计算右侧;
逻辑或,仅当左侧为假时计算右侧;
相等性,按照提升转化
4.9
先判断cp是否是个空指针,再判断cp指向的字符是否为空,如果都不是则条件为真
4.10
while(cin>>i&&i!=42)
4.11
a>b&&b>c&&c>d
4.12
先判断表达式i!=j的值,如果为真,则转化为1与k比较,否则转化为0与k比较
4.13
a)d=3,i=3;
b)d=3.5,i=3;
4.14
第一个非法,试图给数值常量赋值,第二个条件恒为真
4.15
连续赋值满足右结合律,最右边的pi=0,此时代表的是一个指针,然后试图给整型常量ival赋一个指针的值,
dval=ival=0;pi=nullptr;
4.16
a)!=优先级优于=,改为if((p=getPtr())!=0)
b)条件恒为真,明显与预期不符,改为if(1024==i)
4.17
前置版本返回原对象引用,后置版本返回原对象副本
4.18
先将pbeg+1,然后对pbeg+1解引用,这样会导致不输出第一个数,而试图对超尾地址解引用,导致非法
4.19
a)ptr非空指针,且指向的值不为0,然后将ptr指针向前移动一个位置
b)左边表达式改变ival的值,而右边表达式又要使用ival,这将引发错误或产生未定义的行为~~改为ival++即可
c)如果ival下标合法,该表达式恒为真,然后将ival加1
4.20
a)合法,对iter解引用,然后将iter+1
b)合法,对iter解引用,然后将解引用后的数据+1
c)非法,iter 是一个迭代器,它没有名为empty的成员
d)合法,iter指向的字符串是否为空
e)合法,先对iter解引用,然后将解引用后的数据+1
f)合法,先看iter是否指向空串,然后再将iter+1
4.21
for(auto& val:vec)
val=val%2?val*2:val;
4.22
finalgrade=grade>90?"high pass"
:grade>75?"pass"
:grade>60?"low pass":"fail";
if语句更容易理解
4.23
无法将string与bool值相加;
string pl=s+(s[s.size()-1]=='s'?"":"s");
4.24
(grade<60)?”fail”:(grade>90)?”high pass”:”pass”;
4.25
先提升为int 0x00000071
然后求反为0xffffff8d,往左移6位后11 11111111 11111111 10001110 000000
4.26
int在有些机器上是16位的,而 quizl要至少27位
4.27
a)011&111=011,为3
b)011|111=111,为7
c)3&&7为bool值,true
d)3||7为bool值,true
4.28
cout<<sizeof(int)...
4.29
10
1
4.30
a) sizeof(x)+y
b)sizeof(p->mem[i])
c)sizeof(a)<b
d)sizeof(f())
4.31
效率问题,一个返回左值,一个返回副本
4.32
遍历数组同时指针ptr移到超尾位置
4.33
条件运算优先级比逗号高
(someValue?++x,++y:--x),--y
4.34
a)fval转化为bool
b)ival转化为float,然后相加的值转化为 double
c)cval转化为int,然后相乘的值转化为double
4.35
a)有,'a'转化为int,然后值转为char
b)有,ui转为double然后转到float
c)有,float转为double
d)有,ival先转为float,然后跟fval相加后转为double,最后值再转回char
4.36
i*=static_cast<int>(d)
4.37
a)pv=const_cast<void *>(ps)
b)i=static_cast<int>(*pc)
c)pv=static_cast<void*>(&d)
d)pc=reinterpret_cast(char*)pv
4.38
将j/i的值强制转化为double型赋给slope