第4章 表达式
练习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
i%2
i为偶数结果为0,为奇数结果非0
练习4.7
当计算的结果超出该类型所能表示的范围时就会产生溢出
unsigned i=0;--i;
short j=65536;++j;
int k=4294967296;++k;
练习4.8
逻辑与运算符和逻辑或运算符都是先求左侧运算对象的值再求右侧运算对象的值,当且仅当左侧运算对象无法确定表达式的结果时才会计算右侧运算对象的值。这种策略称为 短路求值。相等性运算符未定义求值顺序。
练习4.9
cp是一个指向非空字符串的指针,为真,*cp是字符H
,为真。故最终结果也为真。
练习4.10
int i=0;
while (cin>>i && i!=42)
练习4.11
a>b && b>c && c>d
练习4.12
首先得到 j < k 的结果为 true 或 false,转换为整数值是 1 和 0,然后判断 i 等于 1 还是 0 ,返回 bool 值。
练习4.13
- (a)i=3 d=3.0
- (b)i=3 d=3.5
练习4.14
- 非法,赋值运算符左侧必须是可以修改的左值
- 总是true
练习4.15
不能把一个指针赋给double变量,改为
dval=ival=0;pi=0;
练习4.16
- (a)总是true,改为
if ((p=getPtr())!=0)
- (b)总是true,改为
if (i==1024)
练习4.17
前置递增运算符:将运算对象加1,将改变后的对象作为左值返回
后置递增运算符:将运算对象加1,将对象原始值的副本作为右值返回
练习4.18
不但无法输出第一个元素,而且更糟糕的是如果序列中没有负值,程序可能试图解引用一个根本不存在的元素
练习4.19
- (a)判断ptr是否是空指针,并且ptr所指正数是否为0
- (b)判断ival是否为0,并且ival+1是否为0
- (c)非法,不知道
<=
左右两边的求值顺序,改为vec[ival]<=vec[ival+1]
练习4.20
- (a)合法,返回迭代器所指向的元素,然后迭代器递增
- (b)非法,string类型没有递增操作
- (c)非法,iter是一个迭代器,没有empty成员
- (d)合法,调用iter指向元素的empty成员,判断是否为空
- (e)非法,string类型没有递增操作
- (f)合法,调用iter指向元素的empty成员,判断是否为空,然后迭代器递增
练习4.21
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> ivec{ 0,1,2,3,4,5,6,7,8,9 };
for (int i : ivec)
{
cout << ((i % 2) ? 2 * i : i) << " ";
}
return 0;
}
练习4.22
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
int grade = 0;
string finalgrade, finalgrade2;
cin >> grade;
//version 1
if (grade > 90)
finalgrade = "high pass";
else if (grade > 75)
finalgrade = "pass";
else if (grade > 60)
finalgrade = "low pass";
else
finalgrade = "fail";
//version 2
finalgrade2 = (grade > 90) ? "high pass"
: (grade > 75) ? "pass"
: (grade > 60) ? "low pass" : "fail";
cout << "version 1:" << finalgrade << endl << "version 2:" << finalgrade2;
return 0;
}
多个if语句的版本更容易理解,条件运算符多层嵌套会导致代码的可读性急剧下降
练习4.23
加法运算符的优先级高于条件运算符,改为
string pl = s + (s[s.size() - 1] == 's' ? "" : "s") ;
练习4.24
求值过程等同于
finalgrade = ((grade > 90) ? "high pass" : (grade < 60)) ? "fail" : "pass";
练习4.25
11111111 11111111 11100011 10000000
练习4.26
在某些机器上unsigned int可能没有32位
练习4.27
- (a)3
- (b)7
- (c)true
- (d)true
练习4.28
#include <iostream>
using namespace std;
int main()
{
cout << "bool:\t\t" << sizeof(bool) << " bytes" << endl;
cout << "char:\t\t" << sizeof(char) << " bytes" << endl;
cout << "wchar_t:\t" << sizeof(wchar_t) << " bytes" << endl;
cout << "char16_t:\t" << sizeof(char16_t) << " bytes" << endl;
cout << "char32_t:\t" << sizeof(char32_t) << " bytes" << endl;
cout << "short:\t\t" << sizeof(short) << " bytes" << endl;
cout << "int:\t\t" << sizeof(int) << " bytes" << endl;
cout << "long:\t\t" << sizeof(long) << " bytes" << endl;
cout << "long long:\t" << sizeof(long long) << " bytes" << endl;
cout << "float:\t\t" << sizeof(float) << " bytes" << endl;
cout << "double:\t\t" << sizeof(double) << " bytes" << endl;
cout << "long double:\t" << sizeof(long double) << " bytes" << endl;
return 0;
}
练习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
这个循环在遍历数组 ia,指针 ptr 和 整型 ix 都是起到一个循环计数的功能
练习4.33
如果someValue为真,则x递增y递增,然后y递减
如果送么Value为假,则x递减,y递减
练习4.34
- (a)fval转换成bool
- (b)ival转换成float,相加的结果再转换成double
- (c)cval转换成int,相乘的结果再转换成double
练习4.35
- (a)'a’转换成int,相加的结果转换成char
- (b)ival转换成double,ui转换成double,相减的结果转换成float
- (c)ui转换成float,相乘的结果转换成double
- (d)ival转换成float,与fval相加的结果转换成double,最终的结果又转换成char
练习4.36
i*=static_cast<int>d
练习4.37
- (a)
pv=static_cast<void*>(const_cast<string*>ps);
- (b)
i=static_cast<int>(*pc);
- (c)
pv=static_cast<void*>&d;
- (d)
pc=static_cast<char*>pv;
练习4.38
计算j/i,将其值强制转换为double型,再赋给slope