- 第四章 表达式
P123
练习4.1
105
练习4.2
- *(vec.begin())
- (*(vec.begin()))+1
P124
练习4.3
复合表达式的处理:使用括号强制达到目的、重复改变可能会导致错误。
P126
练习4.4
12/3*4+5*15+24%4/2 = 91;
练习4.5
(a) -86
(b) -18
(c) 0
(d) -2
练习4.6
int a;
if (a%2)
{
cout<<"奇数"
}
else
{
cout<<"偶数"
}
练习4.7
溢出的定义:当计算的结果超出了该类型所能表示的最大范围时就会产生溢出。
short a = 32768;
unsigned a = -10;
int a = 123456789*123456789;
P128
练习4.8
逻辑与:左面为真再判断右面
逻辑或:先判断左面为假再判断右面
相等性运算符:右边的转换为左边的类型再与左边比较
练习4.9
cp是一个指针,指向一个字符串,*cp是一个字符串
二者皆不为空,所以结果为真。
练习4.10
#include<iostream>
using namespace std;
int main()
{
int i;
while((cin >> i)&&(i!=42))
{}
}
练习4.11
a > b && b > c && c > d
练习4.12
算数>关系>逻辑
根据优先级,先计算 < 运算符,对比 j < k是否为真,再计算 != 运算符,如果j<k为真,则i!=1时为真。如果j<k为假,则i!=0为真。
P131
练习4.13
- i=3, d=3.0
- i=3, d=3.5
练习4.14
第一个报错;
第二个判断为真。
练习4.15
无法将指针赋值给int型变量;
double dval; int ival; int *pi;
ival = dval = *pi =0;
练习4.16
- if ((p=getPtr())!=0)
- if (i==1024)
P133
练习4.17
前置的递增运算符:先算后用,后置的递增运算符:先用后算。递减一样。
练习4.18
使用前置递增运算符会导致向量中的第一个元素没有被输出,直到最后一个元素的后一个位置(未知的量,非常危险)
练习4.19
- (*ptr != 0) && (*ptr++) 判断ptr指针指向的int值是否为0
- 含义是先对ival加1,判断ival加1之前的值是否不为0,如果为真,则判断当前ival的值(ival加1后)是否不为0
- 错误,因为求值顺序不一定,会产生未定义的行为。
P134
练习4.20
- 合法,首先对iter解引用,然后让iter++指向下一个位置
- 不合法,返回iter指向的值为string ++操作无意义
- 不合法,解引用运算法优先级低于点运算符,iter为指针,不能使用点运算符
- 合法,相当于(*iter).empty()
- 不合法,*iter可以得到iter所指的字符串,但是字符串并没有++操作。
- 合法,首先判断iter所指向的值是否为空,再对iter加1
P135
练习4.21
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
vector<int> v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
for (auto& j : v)
{
j = (j % 2 != 0) ? j * 2 : j;
cout << j << ' ';
}
cout << endl;
return 0;
}
练习4.22
条件运算符
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
float grade;
cin >> grade;
string finalgrade = (grade > 90) ? "hingh pass" : (grade < 60) ? "fail" : (grade<75)?"lowpass":"pass";
cout << finalgrade;
return 0;
}
if语句
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
float grade;
cin >> grade;
if (grade <= 90)
{
if (grade <= 75)
{
if (grade < 60)
cout << "fail" << endl;
else
cout << "low pass" << endl;
}
else
cout << "pass" << endl;
}
else
cout << "high pass" << endl;
return 0;
}
if语句更容易理解,较为直观。
练习4.23
条件运算符优先级过低
string pl = s + (s[s.size() - 1] == 's' ? "" : "s") ;
练习4.24
满足左结合律时会报错,有未明确的值在右侧;左结合律的话,先算(grade > 90)是否为true,不是的话条件运算表达式返回(grade < 60)的结果,在根据这个表达式的结果返回"fail" 或者"pass"
P139
练习4.25
1111 1111 1111 1111 1110 0011 1000 0000
练习4.26
因为老师学生有31个,所使用的类型最少需要有32位吧,但是在某些机器上,unsigned int 可能就不是32位了
练习4.27
u11 = 3 = 0000 0000 0000 0000 0000 0000 0000 0011
u12 = 7 = 0000 0000 0000 0000 0000 0000 0000 0111
- 3
- 7
- ture
- ture
P140
练习4.28
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
cout << "bool " << sizeof(bool) << endl;
cout << "char " << sizeof(char) << endl;
cout << "short " << sizeof(short) << endl;
cout << "int " << sizeof(int) << endl;
cout << "long " << sizeof(long) << endl;
cout << "long long " << sizeof(long long) << endl;
cout << "float " << sizeof(float) << endl;
cout << "double " << sizeof(double) << endl;
cout << "long double " << sizeof(long double) << endl;
return 0;
}
练习4.29
第一个 10 求的是元素数量;
第二个 1 p为一个地址,*p是一个int变量
练习4.30
- (sizeof x) +y
- sizeof(p->mem[i])
- (sizeof a) < b
- sizeof f()
P141
练习4.31
用前置版本是因为之前书中就提过后置版本可能会造成资源浪费
改成后置版本代码不需要改
练习4.32
ptr指向ia的begin,ix记录当前的位置,当ptr指向ia的最后一个,并且ix也等于ix的长度时循环终止
练习4.33
根据运算符优先级表 优先级: ++ > ?: > ,
但由于?:是满足右结合律,
所以 = (someValue ? ++x, ++y : --x), --y
当 someValue 为真时,计算 ++x, ++y;在计算 --y;
当 someValue 为假时,计算 --x,在计算 --y;
P143
练习4.34
- fival转换为bool类型;
- ival 与 fval的和转换为 dval的类型;
- cval 提升成 int,和 ival 相加后再提升为 double 和 dval 相加
练习4.35
-
- ‘a’ 先提升为 int 和 3 相加,在转换成 char 赋给 cval
- ival 先提升为 float,和 1.0 相乘,然后转换成 unsigned int,和 ui 做减法,其结果转换成 float 赋给 fval
- ui 转换成 float 和 fval 相加,其结果转换为 double 赋给 dval
- ival 提升成 float 和 fval 相加。其结果再提升为 double 和 dval 相加。再将其结果转换为 char 赋给 cval
P147
练习4.36
i *= static_cast<int>d;
练习4.37
pv = static_cast<void*>(const_cast<string*>(ps));
i = static_cast<int>(*pc);
pv = static_cast<void*>(&d);
pc = static_cast<char*>(pv);
练习4.38
将计算 (j / i) 的结果强制转换为 double 类型,然后赋给 slope。