《C++primer》v5 第4章 表达式 读书笔记 习题答案

4.1

105

4.2

*vec.begin()=*(vec.begin())//先调用点运算符,再解引用

*vec.begin()+1=(*vec.begin())+1//先解引用,再加一

4.3略?

4.4

(12/3*4)+(5*15)+(24%4/2)=91

4.5

(a)-86(b)-16

(c)0 (d)0

4.6

n%2

4.7

溢出:计算结果超出该数据类型所能表示的范围

2147483647+1

1U-2

...

4.8

比较低。。

4.9

首先判断cp是否为空指针,若非空指针则判断cp指向的是否是空字符串

4.10

    int val;
    while(cin>>val&&val!=42);

4.11

int main()
{
    int a,b,c,d;
    cin>>a>>b>>c>>d;
    if(a>b&&b>c&&c>d)
        cout<<"Yes"<<endl;
    else
        cout<<"No"<<endl;
    return 0;
}

4.12

由于<优先级高于!=,所以先执行j<k返回一个bool类型,可能是0或1,再执行!=运算。最终返回一个bool运算结果,可能是0或1。

4.13

(a)d=3,i=3 因为是从右往左执行的

(b)i=3,d=3.5

4.14

第一种将报错,42是常量,不能被赋值

第二种,该表达式返回42,为真,但是可能并非设计者原意

4.15

指针数据类型与int和double都是不相容的,不能这样赋值。

正确答案:dval=ival=*pi=0;

4.16

(a)将先执行 !=,再执行=。

正解:if((p=getPtr())!=0)

(b)=是赋值,不是判断是否相等

正解:if(i==1024)

4.17

前置运算符,先求值再返回该对象用于左值运算对象

后置运算符,返回该对象的一个副本作为右值运算对象,再求值

4.18

使用前置运算符将不能输出第一个元素,而且会访问越界

另外,经测试,++*it和*++it是不一样的。前置可能导致死循环,因为只是给数值自加了。

4.19

(a)如果ptr不是空指针,那么判断ptr指向的是否是0,再将ptr指向下一个位置

(b)先判断ival是为是0,再将ival自加1,再判断ival是否为0。

(c)等价于vec[ival]<=vec[ival+1],++ival;

4.20

(a)合法。等价于*iter,iter++;

(b)非法。string类型不支持++运算。

(c)非法。先执行成员访问运算符,而iter没有empty这个成员,所以将报错。

(d)正确。等价于(*iter).empty()

(e)正确。等价于++(*iter)

(f)正确。等价于iter->empty(),iter++;

4.21

int main()
{
    vector<int> vec;
    int val;
    while(cin>>val)
        vec.push_back(val);
    for(auto &i:vec)
        if(i%2)
            i=i*2;
    for(auto i:vec)
        cout<<i<<endl;
    return 0;
}

4.22

int main()
{
    int val;
    while(cin>>val)
    {
        string grade=(val>90)?"high pass":(60<=val&&val<=75)?"low pass":(val<60)?"fail":"pass";
        cout<<grade<<endl;
    }
    return 0;
}

明显if语句更好懂

int main()
{
    int val;
    while(cin>>val)
    {
        if(val>90) cout<<"high pass"<<endl;
        else if(val<60) cout<<"fail"<<endl;
        else
        {
            if(60<=val&&val<=75) cout<<"low pass"<<endl;
            else cout<<"pass"<<endl;
        }
    }
    return 0;
}

4.23

由于加法运算优先级高于条件运算符,因此会先执行加法,得到一个string类型,而string与字符比较,会报错。

正解: string p=s+(s[s.size()-1]==‘s‘?"":"s");

4.24?

不是很懂结合律这块。留着以后研究。

4.25

不懂Latin-1字符集是什么。。

该表达式,第一步取反得到10001110

第二步左移6位得到10000000

4.26

unsigned int在不同机器上位数不同,不能确保一定可以表示30个学生

4.27

ul1=011

ul2=111

(a)011=3

(b)111=7

(c)1

(d)1

4.28

    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<<"char:"<<sizeof(char)<<endl;

这是在我的机器上的输出:

short:2
int:4
long:4
long long:8
float:4
double:8
char:1

4.29

int main()
{
    int x[10];
    int *p=x;
    cout<<sizeof(x)<<" "<<sizeof(*x)<<" "<<sizeof(x)/sizeof(*x)<<endl;
    cout<<sizeof(p)<<" "<<sizeof(*p)<<" "<<sizeof(p)/sizeof(*p)<<endl;
    return 0;
}
sizeof(x)是一个大小为10的int数组的空间
sizeof(*x)是一个指向int的指针的空间
sizeof(p)是一个指向int的指针的空间
sizeof(*p)是一个int元素的空间
40 4 10
4 4 1

以上是输出

4.30

(a)sizeof (a+b)

(b)sizeof (p->mem[i])

(c)sizeof (a<b)  注意小于优先级比sizeof低

(d)sizeof (f())

4.31

后置会额外返回一个对象的副本,使用前置运算符更符合编程的初衷,效率也更高

4.32

遍历ia数组。

4.33

如果someValue为真,则++x,++y并返回自加以后的y。如果为假,则--x,--y并返回自减以后的y。

注意逗号运算符从左向右依次求值,最终返回右侧表达式的值

4.34

(a)float转为bool

(b)+:int转float,=float转double

(c)*:char转int,+int转double

4.35

(a)char转int,再转char?

(b)*int转double,-unsignedint转double,=double转float

(c)*unsignedint转float,float转double

(d)int转float,float转double,double转char

为避免精度损失,整型与浮点型计算,整型会被转化成浮点型

4.36

i*=(int)d;

4.37

(a)pv=static_cast<void*>(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

int main()
{

    int i=3,j=5;
    double slope=static_cast<double>(j/i);
    cout<<slope<<endl;
    return 0;
}

比如上面的结果,输出1

《C++primer》v5 第4章 表达式 读书笔记 习题答案,布布扣,bubuko.com

时间: 2024-12-28 10:10:56

《C++primer》v5 第4章 表达式 读书笔记 习题答案的相关文章

《C++primer》v5 第5章 语句 读书笔记 习题答案

5.1 空语句只有一个";".如果什么也不想做可以使用空语句. 5.2 用花括号{}括起来的叫块,也叫复合语句.有多条语句作用在同一个作用域时,需要用花括号括起来. 5.3 降低了. 5.4 (a)每次迭代时候会初始化iter,但是iter缺少初值,所以这段代码根本不会通过编译.另外这里的括号需要一个bool类型的,而定义迭代器根本不会返回一个bool类型.假如上面那些问题都可以通过,每次迭代都会初始化这个iter,会导致死循环. (b)我试了一下编译未通过是因为没找到适合的find函

《C++primer》v5 第1章 开始 读书笔记 习题答案

从今天开始在博客里写C++primer的文字.主要以后面的习题作业为主,会有必要的知识点补充. 本人也是菜鸟,可能有不对之处,还望指出. 前期内容可能会比较水. 1.1略 1.2略 1.3 cin和cout分别是istream和ostream的对象. #include<iostream> using namespace std; int main() { cout<<"Hello,world"<<endl; return 0; } 1.4 #incl

《C++primer》v5 第6章 函数 读书笔记 习题答案

6.1 实参是在函数调用处填写的参数.形参是在函数体使用的参数. 实参是形参的初始值. 具体参见:http://blog.163.com/zhengguo_li/blog/static/703014802013423501214/ 6.2 (a)该函数试图返回一个局部变量.当函数调用结束后,s所占内存将会被释放,所以返回s是无效的 (b)该函数缺少返回值 (c)定义了两个同名的形参 (d)后面的语句应该写在{}里 6.3.6.4 using namespace std; int fact(int

《C++primer》v5 第7章 类 读书笔记 习题答案

7.1.7.2.7.3 #include<iostream> #include<cstdio> #include<vector> #include<string> using namespace std; struct Sales_data { string bookNo;//isbn编号 unsigned units_sold=0;//该书的销量 double revenue=0.0;//该书的总销售收入 string isbn()const {retur

《C++primer》v5 第2章 C++基础 读书笔记 习题答案

2.1 int,long long ,short 可表示范围和占用内存空间不同.具体与计算机有关. 无符号类型只能表示0和正数,带符号类型可以表示负数,0,正数. float是单精度,一般占用4个字节,double是双精度,一般占用8个字节,它们可表示的数据范围也不相同. 2.2 利率用double,本金和付款用int 2.3 unsigned u=10,u2=42; cout<<u2-u<<endl; cout<<u-u2<<endl; int i=10,

《C++primer》v5 第3章 字符串、向量和数组 读书笔记 习题答案

3.1略 3.2 string str; //读行 while(getline(cin,str)) cout<<str<<endl; //读单个词 while(cin>>str) cout<<str<<endl; 3.3 输入运算符读到空白符结束 getline读到换行符结束,并丢弃换行符 3.4 比较大小. 比较大小是比较的第一个不相同的字符的大小. int main() { string a,b; cin>>a>>b;

《C++primer》v5 第12章 动态内存 读书笔记 习题答案

这一章暂时没写完,先留着以后再写. 在C++程序中,程序员可以给手动开辟内存,但是这块内存需要手动释放,不便管理,因此新标准提供智能指针类型来管理动态对象.它负责自动释放所指向的对象. shared_prt允许多个指针指向同一个对象 unique_ptr独占所指向的对象 weak_ptr是一个弱引用,指向shared_ptr所管理的对象 一些操作: p=q;//递减p的引用计数,递增q的引用计数 shared_ptr<T> p(q);//p是q的拷贝,递增q的引用计数 通过make_share

《C++primer》v5 第8章 IO库 读书笔记 习题答案

8.1.8.2 这一章不咋会啊.. istream &read(istream &is) { int a; auto old_state=is.rdstate(); is.clear(); is>>a; is.setstate(old_state); return is; } int main() { read(cin); return 0; } 8.3 读到eof或错误类型的时候 8.4 #include<fstream> using namespace std;

《C++primer》v5 第11章 关联容器 读书笔记 习题答案

11.1 map是关联容器,vector是顺序容器 11.2 略 11.3 int main() { map<string,int> word; string s; while(cin>>s) word[s]++; for(auto i:word) cout<<i.first<<" "<<i.second<<endl; return 0; } 11.4 void convers(string &s) { s