C++primer第二章学习及答案:变量和基本类型

5 篇文章 0 订阅

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、基本内置类型

算数类型:

常用char为1字节,short、int为2字节,long、float为4字节,double为8字节。

字面值:

如42,a这样的值一望而知,叫字面值,包括整形与浮点数字面值,字符和字符串字面值(如空指针nullptr),转义字符字面值,bool和指针字面值。

类型转换:

非bool转bool:0为false,其余为True
浮点数转整数:往小取整

转义符

均以反斜线开始
换行:\n
回车:\r
引号:’ "

二、变量

变量初始化

注意C++中初始化和赋值是两个从原理上完全不同的操作,显示化声明变量即为定义,定义只可以一次但声明可以多次。
需要注意的是,内置类型(int等)的变量未被显式初始化时,他的值由定义的位置决定, 定义在函数体内部的内置类型变量将不被初始化。

列表初始化

几种初始化方法,带花括号的为列表初始化:

int u = 0;
int u = {0};
int u{0};
int u(0);

三、复合类型

第二章介绍的复合类型主要有两种,引用与指针,这部分需要搞清楚才能理解const关键字。
复合类型的声明:基本数据类型+声明符(变量名)
类型修饰符(引用的&与指针的 ∗ * )不过是声明符的一部分罢了。

引用

引用其实就是给变量起了别名,此时无拷贝操作。

int i = 1;
int &r = i, i2 = 1024; //r为i引用,i2为int

指针

∗ p *p p复合类型的声明.这里 ∗ p *p p为一个整体,而不是int*,否则会产生理解上的错误:

int *p=&i;  //指针p存放i的地址,它指向int型。
int **p1 = &p  //p1为指向int型指针的指针。

也可以写成:

int* p1, p2;

这种写法容易产生理解错误,需要注意*p为复合类型,这里p1为指针,p2为整形向量。
这种写法下的p1,p2均为指针:

int *p1,*p2;

复合类型声明的理解

将声明符从右向左理解,&表明他是引用,其余确定是什么的引用。

int *&i = j;   //指针i是对指针j的引用

四、const限定符

用const赋的值不能够被修改.
顶层(high-level const)const与底层const(low-level const):顶层const可以表示任意的对象是常量,对任何数据类型都适用。底层const与指针和引用等复合类型的基本类型部分有关。
high-level const:指针是常量。

int *const p1;

low-level const:指针所指对象是常量。

const int *p2;

constexpr用于初始化常量表达式,constexpr强制为high-level const。
如果将指针设置为constexpr,必须在函数体之外,否则指针存储位置是变动的不可以赋值。

五、处理类型

类型别名

typedef double wages;
using Si = Sales_item;

auto类型说明符

可以自动推断表达式所属的类型,自动忽略high-level const。

const int cr = 2;  
auto a = cr;     //类型为int
const auto b = a;  //类型为const int

decltype类型指示符

这里作为例外,&不作为别名,表示引用类型

const int &cj = 0;
decltype(cj) x = 0;  //x为引用
decltype(cj+0) y = 0; //y为int

两个括号时,认为表达式为引用

decltype((cj)) z = 0;// z为引用

解引用符*得到的也是引用

int i = 2,*p = &i;
delctype(*p) k = 0; //k为引用

六、自定义数据结构

重写Sales_item并重新编写第一章练习。
Sales_data.h

#ifndef SALES_DATA_H
#define SALES_DATA_H
#include<string>
struct Sales_data
{
    std::string bookNo;
    unsigned unit_sold = 0;
    double revenue = 0.0;
};
#endif

输入输出:

#include<iostream>

#include "Sales_data.h"

int main(){
    Sales_data book;
    std::cin >> book.bookNo >> book.revenue >> book.unit_sold;
    std::cout << book.bookNo << book.revenue << book.unit_sold << std::endl;
}

加法:

#include<iostream>

#include "Sales_data.h"

int main(){
    Sales_data book1,book2;
    std::cin >> book1.bookNo >> book1.revenue >> book1.unit_sold >> book2.bookNo >> book2.revenue >> book2.unit_sold; 
    if(book1.bookNo == book2.bookNo){
    std::cout << book1.revenue+book2.revenue << std::endl;
    return 0;
    }
    else{
        std::cerr << "ISBN must be same" << std::endl;
        return -1;
    }
}

多个文件加法:

#include<iostream>

#include "Sales_data.h"

int main(){
    Sales_data Trans;
    if(std::cin >> Trans.bookNo >> Trans.revenue >> Trans.unit_sold){
    double TotalRevenue = Trans.revenue;
    while (std::cin >> Trans.bookNo >> Trans.revenue >> Trans.unit_sold)
    {
        TotalRevenue += Trans.revenue;
    }
    std::cout << TotalRevenue << std::endl;
    return 0;
    }
    else{
        std::cerr << "No Data" << std::endl;
        return -1;
    }
}

bookstore.cpp

#include<iostream>

#include "Sales_data.h"

int main(){
    Sales_data Total,Trans;
    if(std::cin >> Total.bookNo >> Total.revenue >> Total.unit_sold){
    while (std::cin >> Trans.bookNo >> Trans.revenue >> Trans.unit_sold)
    {
        if (Total.bookNo == Trans.bookNo)
        {
            Total.revenue += Trans.revenue;
        }
        else
        {
            std::cout << Total.bookNo <<Total.revenue << Total.unit_sold << std::endl;
            Total = Trans;
        }
    }
    std::cout << Total.bookNo <<Total.revenue << Total.unit_sold << std::endl;
    return 0;
    }
    else{
        std::cerr << "No Data" << std::endl;
        return -1;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值