C++ Primer Plus 学习记录(第三章节-包含练习题答案)

3.1 简单变量

3.1.1 变量名

C++命名规则:
1、在名称中只能使用字母字符、数字和下划线(_)。
2、名称的第一个字符不能是数字。
3、区分大写字符与小写字符
4、不能将C++关键字用作名称。
5、以两个下划线或下划线和大写字母打头的名称被保留给实现(编译器及其使用的资源)使用。以一个下划线开头的名称被保留给实现,用作全局标识符。
6、C++对于名称的长度没有限制,名称中所有的字符都有意义,但有些平台有长度限制

3.1.2 整形

术语宽度(width)用来描述存储整形时使用的内存量。

3.1.3 整形short、int、long和long long (C++工具检验类型的长度)

不用的系统中,每种类型的宽度不全相同
1、short至少16位
2、int至少与short一样长
3、long至少32位,且至少与int一样长
4、long long 至少64位,且至少与long一样长

位与字节
计算机内存的基本单元是位(bit)。
字节(byte)通常是指8位的内存单元。
字节指的就是描述计算机内存量的度量单位,1KB等于1024字节,1MB等于1024KB。

实际上。short是short int的简称,long是long int的简称。

可以使用sizeof()检查类型的长度。sizeof返回类型或者变量的长度,单位为字节。头文件#include<climits>
包含了关于整形限制的信息,定义了各种限制的符号名称。
INT_MAX为int的最大取值
CHAR_BIT为字节的位数

例如:

#include <iostream>
#include <climits>
using namespace std;
int main()
{
    int a = 1;
    cout << sizeof a << endl;//对于变量名括号是可选的
    cout  << INT_MAX << endl;//对于类型名,必须放在括号里
    cout << sizeof(int);
    return 0;
}

赋值方式

int a = 101;
int a(1);
int a = {1};
int a{1};
int a{};//大括号里不包含任何东西,初始化为0

3.1.4 无符号类型

1、使用unsiged修改声明即可

3.1.5 选择整形类型

1、int被设置为对目标计算机而言最为自然的长度。
自然长度(natural size)指的是计算机处理起来效率最高的长度。
2、无负数,选择无符号类型
3、如果变量的最大值大于16位整数的最大可能值,使用long,即使系统上int为32位。为了便于移植。
4、为了节省内存,使用short。
5、只需要一个字节,使用char。

3.1.6 整形字面值

1、十进制 a = 42;//42
2、八进制 a = 042;//66
3、十六进制 a = 0x42//34;
4、如果要以八进制或者十六进制显示值,可以使用cout的一些特殊特性。
5、头文件iostream提供了endl,也提供了控制符dec、hex和oct,显示十进制、十六进制和八进制。
6、默认为十进制。在修改格式之前,原来的格式一直有效。
7、如果使用using namespace std;不能再将其用作变量名,使用std::hex可以将其用作变量名

例如

#include <iostream>
using namespace std;
int main()
{
    int chest = 42;
    cout << chest << endl;
    cout << hex;
    cout << chest << endl;
    return 0;
}

结果是

42
2a

3.1.7 C++如何确定常量的类型

1、后缀
整数后面的l或者L表示long
u或者U表示unsigned int
ul(顺序,大小写无所谓)表示unsigned long
ll或LL表示long long
ull表示unsigned long long
2、长度
对于十进制,不带后缀,使用这几种最小能够存储该数的最小类型来表示:int、long、long long。
对于八进制和十六进制,是:int、unsigned int、long、unsigned long、long long或unsigned long long。
3、十六进制常用来表示内存地址,没有符号,所以unsigned int比long更适合表示16进制地址

3.1.8 char类型:字符和小整数

1、char是专为存储字符而设计的。
2、转义序列
退格 \b
回车 \r
振铃 \a
反斜杠 \
问号 ?
单引号 ’
双引号 "
3、signed char 和unsigned
4、wchar_t
wcin和wcout可用于处理wchar_t流
可以通过加上前缀L来指示宽字符常量和宽字符串
本书不适用,但应该知道

3.1.9 bool类型

任何数字或者指针值都可以被隐式转换为bool值
任何非零值都被转换为true
而零被转换为false

3.2 const限定符

1、一般都是将常量名称的首字母大写
2、在声明变量的时候必须提供值,否则长常量的值是不确定的,且无法修改
2、const比#define要好在哪里:a、它能明确指定类型;b、可以使用C++的作用域规则将定义限制在特定的函数或文件中(第九章);c、可以将const用于更复杂的类型

3.3 浮点数

3.3.1 书写浮点数

1、浮点数表示方法:a、标准小数点表示法;b、E表示法
2、E表示法,也可以使用e,指数也可以是正数也可以是负数。
3、之所以称为浮点,就是因为小数点会移动

3.3.2 浮点类型

1、3种浮点类型:float、double和long double
2、C和C++有效位的要求是:float至少是32位,double至少48位,且不少于flaot,long double至少和double一样多。这三种有效位可以一样多
3、ostream的setf(),调用迫使输出使用定点表示法,它可以防止把较大的值切换成E表示法,并使程序显示到小数点后6位。
参数ios_base::fixed和ios_base::floatfield是通过包含iosream来提供的常量。
4、cout所属的ostream能够精确地控制输出的格式–字段宽度、小数位数、采用小数格式或者E格式。在17章之后将会对其进行介绍。

3.3.3 浮点常量

1、默认情况下,浮点常量为double类型
2、如果希望是float类型,使用f或F后缀(有些老式的不支持)
3、对于long double类型,可使用l或L后缀
4、1.234f(float)、2.45E20F(float)、2.345324E28(double)、2.2L(long double)

3.3.4 浮点数的优缺点

1、与整数相比,浮点数有两大优点:a、可以表示整数之间的值;b、有缩放因子,表示的范围大得多;c、但运算速度慢,精度降低。
2、整数和浮点数统称为算术类型。

3.4 C++算术运算符

1、五种基本的算术运算:加法、减法、乘法、除法以及求模。
2、+运算符对操作数执行加法运算。4+20=24
3、-运算符从第一个数中减去第二个数。12-3=9。
4、运算符将操作数相乘。284=112.
5、/运算符用第一个数除以第二个数。1000/5=200;17/3=5结果为商的整数部分,小数部分被丢弃。
6、%运算符求模。生成第一个数除以第二个数后的余数。19%6=1;两个操作数必须都是整数,否则编译错误;如果其中一个是负数,则结果的符号满足如下规则:(a/b)*b+a%b=a。
7、对于float,C++只保证6位有效位。

3.4.1 运算符优先级和结合性

1、算术运算符遵循通常的代数优先级,先乘除、后加减。
2、可以使用括号来执行自己定义的优先级。
3、附录D介绍了所有C++运算符的优先级。
4、当两个运算符的优先级相同时,C++将看操作数的结合性(assocoativity),是从左到右的

3.4.2 除法分支

1、除法运算符的行为取决于操作数的类型
2、操作数均为整数,整数除法,结果的小数将被丢弃,使得最后的结果是一个整数。
3、如果其中有一个操作数是浮点数,小数部分保留,结果为浮点数
4、两个数都是double,结果也是double,两个都是float,结果也是float
5、使用相同的符号进行多种操作叫做运算符重载(operator overloading)

3.4.3 求模运算符

没啥可讲

3.4.4 类型转换

1、C++自动执行很多类型转换:
a、将一种算术类型的值赋给另一种算术类型的变量时,C++将对值进行转换;
b、表达式中包含不同的类型时,C++将对值进行转换;
c、将参数传递给函数时,C++将对值进行转换。
2、初始化合赋值进行的转换
a、C++允许将一种类型的值赋给另一种类型的变量。
b、值被转换为接收变量的类型。
c、将一个值赋给值取值范围更大的类型通常不会导致什么问题。
3、将浮点值赋给整型将导致两个问题:a、数字将被截短,注意是截取,不是四舍五入;b、float值对于int变量可能太大了。
4、以{}方式初始化时进行的转换(C++11)
a、C++11将使用大括号的初始化称为列表初始化(list-initialization),它对类型转换的要求更为严格。
b、列表初始化不允许缩窄(narrowing),即变量的类型可能无法表示赋给它的值。不允许将浮点数转换为整数。
c、变量不允许

char c3 = {66};//允许
int x = 66;
char c4 = {x};//不允许,x不是常量

5、表达式中的转换
a、自动转换
计算表达式时,C++将bool、char、unsigned char、signed char和short值转换为int。被称之为整型提升(integral promotion)
b、有符号整形按级别从高到低依次为long long、long、int、short和signed char。
c、无符号整型排列顺序与有符号整型相同。
d、类型char、signed char和unsigned char的级别相同。
e、类型bool的级别最低。
f、wchar_t、char16_t和char32_t的级别与其底层类型相同。
6、传递参数时的转换
第七章
7、强制类型转换

(long) thorn
long(thorn)

第一种格式来自C语言
第二种格式是纯粹的C++,该方式的想法是,要让强制类型转换就像是函数调用。

C++还引入了4个强制类型转换运算符,使用更为严格,将在15章介绍。
static_cast<>可用于从一种数值类型转换为另一种数值类型。

static_cast<long> (thorn)

3.4.5 C++11中的auto声明

1、auto让编译器能够根据初始值的类型推断变量的类型
2、第9章会细讲,auto有关其以前的含义
3、对于带小数的数字,默认为double类型
4、auto更重要的是处理复杂类型

//对于C++98代码
std::vector<double> scores;
std::vector<double>::iterator pv = scores.begin();
//C++11可以将其写为:
std::vector<double> scores;
auto pv = scores.begin();

3.5 总结

1、C++类型分为两组:
一组是存储为整型的值组成,另一组是存储为浮点格式的值组成。
2、整形通过存储值时使用的内存量及有无符号来区分,整形从小到大依次是:
bool、char、signed char、unsigned char、short、unsigned short、int、unsigned int、long、unsigned long以及C++11新增的long long和unsigned long long。C++11新增了wchar_t类型,如char16_t和char32_t存储16和32位字符编码。
short至少为16位
long至少为32位且至少和int一样长。

3.6 复习题

1、为什么C++有多种整型?
可以根据特定需求选择最适合的类型。例如,可以使用short来存储空格,使用long保存存储容量,也可以寻找可提高特定计算的速度的类型。
2、声明与下属描述相符的变量
a、short整数,值为80

short rbis = 80

b、unsigned int整数,值为42110

unsigned int q = 42110

c、值为3000000000的整数

unsigned long ants = 3000000000

3、C++提供了什么措施来防止超出整型的范围?
C++没有提供自动防止超出整数限制的整数,可以使用头文件climits来确定限制情况。
4、33L和33之间有什么区别
常量33L的类型为long,常量33的类型为int。

5、下面两条C++语句是否等价?

char grade = 65;
char grade = 'A';

这两条语句不真正等价,虽然对于某些系统来说,它们是等效的。最重要的是,只有在使用ASCII码的系统上,第一条语句才将得分设置为字母A,而第二条语句还可用于使用其他编码的系统。其次,65是一个int常量,而‘A’是一个char常量。

6、如何使用C++来找出编码88表示的字符?指出至少两种方法。
四种方式:

char c = 88;
cout << s << endl;

cout.put(char(88));

cout << char(88) << endl;

cout << (char)88 << endl;

7、将long值赋给float变量会导致舍入误差,将long值赋给double变量呢?将long long值赋给double类型呢?
这个问题的答案取决于两个类型的长度。如果long为4个字节,则没有损失。因为最大的long的值为20亿,即有十位数。由于double提供了至少13位有效数字,因而不需要进行任何舍入。long long 类型可以提供19位有效数字,超过double保证的13位有效数字。

8、下列C++表达式的结果分别是多少?
a、8*9+2
74

b、6*3/4
4

c、3/4*6
0

d、6.0*3/4
4.5

e、15%4
3

9、假设x1和x2是两个double变量,您要将它们作为整数相加,再将结果赋给一个整型变量。请编写一条完成这项任务的C++语句。如果要将它们作为double值相加并转换为int呢?

(int)pos = (int)x1 + (int)x2;
(int)pos = (int)(x1 + x2);

10、下面每条语句声明的变量都是什么类型?
a、auto cars = 15
int

b、auto iou = 150.37f
float

c、auto level = ‘B’
char

d、auto crat = U’/U00002155‘
char32_t

e、auto fract = 8.25f/2.5
double

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值