4.1:105
4.2:*(vec.begin()),*(vec.beign())+1
4.3:可以接受,因为遵循开发规范编写的代码,出现程序潜在缺陷的几率比较小,而代码生成效率很重要
4.4:((12/3)*4)+((5*15)+((24%4)/2))=91
代码验证:
#include<iostream>
using namespace std;
int main()
{
cout<<12/3*4+5*15+24%4/2<<endl;
return 0;
}
4.5:
- -86
- 18
- 0
- -2
4.6:number%2?false:true
4.7:溢出指的是计算的结果超出该类型能表达的范围,下面是示例
int number = 32767;
number++;//假设int类型占16位
number/0;
int number = -32768;
number--;
4.8:
- 逻辑与(&&):从左向右计算,当遇到一个值为假时停止运算,返回假,否则返回真
- 逻辑或(||):从左向右计算,当遇到第一个值为真时停止运算,返回真,否则返回假
- 相等性与运算:现将所有的bool值转换为算术类型,false转为0,true转为1
4.9:先计算并判断cp,然后对cp进行解引用,再判断*cp
4.10
int main()
{
int num;
cin >> num;
while(num!=42)
{
cin >> num;
cout << "plz continue enter number" << endl;
}
cout << "yes now the number is 42" << endl;
return 0;
}
4.11:(a>b&&b>c&&c>d)?true:false
4.12:将i与j<k的结果进行比较,相等是表达式返回false,否则返回true
4.13:
- 3.0
- 3
- 4.14
- 非法语句,编译报错
- i被赋予42的值
4.15:不能用指针赋值给一个int型变量,应该改为
*pi = dval = ival = 0;
4.16
- 先计算后面的判断式,再进行赋值,应该改为if((p=getptr())!=0)
- if始终为真,应该改为if(i==1024)
4.17:前置运算符是直接将变量+1,值是+1后的值,而后置运算符要先保存一个现有变量的副本,表达式使用这个值,接下来再对值++
4.18:输出不了第一个vector对象的值,其余与后置相同
4.19:
- ptr的值不为0且不指向空地址时表达式为真
- ival的值不为0和-1时为真
- vec中后一个元素大于前一个元素时为真
4.20:
- 合法,iter先向后移动一位,然后进行解引用
- 不合法,不能先对iter解引用再自增,因为string类不支持自增操作
- 不合法,不能对iter.empty()解引用,正确写法应该是(*iter).empty()
- 合法,等价于(*iter).empty()
- 不合法,理由同第二条
- 合法,先对iter调用empty方法,再对iter进行自增
4.21:
vector<int> v;
for (int i = 1; i <= 10; ++i)
v.push_back(i);
for (auto it = v.begin(); it != v.end(); ++it)
(*it) % 2 ? ((*it)=(*it) * 2) : false;
for (auto it = v.begin(); it != v.end(); ++it)
cout << *it << " ";
显然,使用多个if的语句更好理解
条件表达式版本
int grade;
cin >> grade;
cout << ((grade > 90) ? "high pass" : (grade < 60) ? "fail" : (grade > 60 && grade < 75) ? "low pass" :"pass");
if语句版本
int grade;
cin >> grade;
if (grade < 60)
cout << "fail" << endl;
else if (grade <= 75)
cout << "low pass" << endl;
else if (grade < 90)
cout << "pass" << endl;
else
cout << "high pass" << endl;
4.23:不应该把一个加法表达式放在判断的左侧
正确写法:
string p1 = (s=(s + s[s.size() - 1])) == 's' ? "" : "s";
4.24:先判断成绩是否大于90,再判断是否小于60,最后得出结果
4.25:10111111
4.26:可能因为int只有16位而得不到正确结果
4.27:
- 3
- 7
- true
- true
4.28
int a;
unsigned int b;
long c;
unsigned long d;
long long e;
unsigned long long f;
char g;
bool h;
float i;
double j;
cout << sizeof(a)<<endl;
cout << sizeof(b)<<endl;
cout << sizeof(c)<<endl;
cout << sizeof(d)<<endl;
cout << sizeof(e)<<endl;
cout << sizeof(f)<<endl;
cout << sizeof(g)<<endl;
cout << sizeof(h)<<endl;
cout << sizeof(i)<<endl;
cout << sizeof(j)<<endl;
4.29:结果是10和2,第二行代码的执行结果和想象的不一样,暂时不知原因
4.30
- (sizeof x)+y;
- 无需改变
- (sizeof a)<b;
- 无需改变
4.31:前置和后置是没有影响的
int x[5], cnt = 5;
for (int ix = 0; ix != 5; ix++, cnt--)
{
cout << "this is " << ix << "times cycle" << endl;
x[ix] = cnt;
cout << ix << " " << cnt << endl;
}
4.32:遍历整个ia数组,对其进行操作
4.33:当somevalue不等于0时,对x和y进行自增,否则自减
4.34:
- float转换为bool型
- float加上int型之后转换为double
- 转换为double
4.35:
- 没有
- 发生了,运算结果被转为float类型
- 发生了,运算结果转为double类型
- 发生了,运算结果有算术类型转为char
4.36:i*=(int)d;
4.37:
pv = const_cast<string *>(ps);
i = static_cast<int> (*pc);
pv = static_cast<void*>(&d);
pc = static_cast<char *>(pv);
4.38:强制执行浮点数除法并把结果保存到一个double型变量中