C++ Primer Plus(嵌入式公开课)---1-3章

2023-05-16

1011

C++ Primer Plus

    • 名词解释
    • 数值范围
  • 第1章 预备知识
    • 1.1 C++简介
    • 1.2 C++简史
      • 1.2.2 C语言编程原理
      • 1.2.3 面向对象编程
      • 1.2.4 C++和泛型编程
      • 1.2.5 C++的起源
    • 1.3 可移植性和标准
      • 1.3.2 本书遵循的C++标准
    • 1.4 程序创建的技巧
      • 1.4.1 创建源代码文件
      • 1.4.2 编译和链接
  • 第2章 开始学习C++
    • 2.1 编辑/编译/运行第一个c++程序 + 注释
      • 2.1.1 第一个c++程序
      • 2.1.2 注释
      • 2.1.3 预处理器和iostream文件
      • 2.1.4 头文件名cmath和math.h
      • 2.1.5 名称空间std
    • 2.2 初识运算符重载(<<) + 变量声明和赋值
      • 2.2.1 初识运算符重载
      • 2.2.2 变量声明+赋值
    • 2.3 输入指令cin + 类简介
      • 2.3.1 cin
      • 2.3.2 使用cout拼接
      • 2.3.3 类简介
    • 2.4 函数
      • 2.4.1 调用库函数
      • 2.4.2 自定义函数
    • 2.5 总结
    • 2.6 复习题(重新看第11题)
    • 2.7 编程练习
  • 第3章 处理数据
    • 3.1 简单变量
      • 3.1.1 变量名命名规则
      • 3.1.2 整型char、short、int、long、long long
        • 补充:位bit与字节byte
      • 3.1.3 运算符sizeof() + 头文件climits
        • sizeof()
        • 头文件climits
        • 初始化(C语言和C++)
        • C++11初始化方式(不推荐)
      • 3.1.4 无符号类型unsigned + 预处理语句#define(类似宏定义)
        • 案例①:short 和 unsigned short
        • 案例②:int 和 unsigned int
      • 3.1.5 数据类型选择
      • 3.1.6 不同的进制数(二进制、八进制、十六进制)
        • 用cout输入不同进制(默认输出十进制)
      • 3.1.7 C++如何确定常量的类型
      • 3.1.8 char类型---C++转义字符列表
        • C++转义序列的编码
        • 成员函数cout.put()
        • 三种实现换行的代码
        • signed char 和 unsigned char
        • 综合案例:
      • 3.1.9 bool类型
    • 3.2 const限定符---定义符号常量
    • 3.3 浮点数
      • 3.3.1 书写方式
      • 3.3.2 浮点数类型---float 和 double
      • 3.3.3 浮点常量
      • 3.3.4 浮点数的优缺点
    • 3.3' 浮点数的存储 + 浮点数为什么不精确
      • 问题①:浮点数在系统中是如何存储的?
      • 问题②:float的精度为什么比不上double?
      • 问题③:浮点数为什么不精确?
      • 更多的案例:
    • 3.4 C++算术运算符 + - * / %
      • 3.4.1 案例 + 运算优先级和结合性
        • 案例解释①:ostream类的方法setf()
        • 案例解释②:和为什么是61.419998而不是61.42
        • 运算优先级和结合性
      • 3.4.2 除法分支 + 运算符重载简介
        • 除法分支
        • 运算符重载
      • 3.4.3 求模运算符
      • 3.4.4 类型转换
        • ①初始化和赋值进行的转换:
        • ②以{ }方式初始化时进行的转换(C++11)(这种赋值方式不推荐--3.1.3)
        • ③表达式中的转换
          • I.整型提升
          • II.被动转换
        • ④参数传递时的转换
        • ⑤强制类型转换
          • C语言:(typeName) value 和 C++:typeName (value)
          • C++:**static_cast(value)**:
      • 3.4.5 C++11中的auto声明
    • 3.5 总结
    • 3.6 复习题(重新看第2( c)、6、7、9、10(e)题)
    • 3.7 编程练习
  • 第4章 复合类型

名词解释

名词解释
POP面向过程编程(procedure oriented Programming)
OOP面向对象编程(object oriented programming)
GP泛型编程(generic programming)
运算符重载(operator overloading)
整型提升(integral promotion)

数值范围

类型取值范围加1/减1 操作
short
(16位)
-32768 ~ 32767
≈ 3*10的4次方
32767+1应该等于-32768
unsigned short
(16位)
0 ~ 65535
≈ 6*10的4次方
0-1应该等于65535
int
(32位)
-2147483648 ~ 2147483647
≈ 2*10的9次方
2147483647+1应该等于-2147483648
unsigned int
(32位)
0 ~ 4294967295
≈ 4*10的9次方
0-1应该等于4294967295
char
(8位)
-128 ~ 127127+1应该等于-128
signed char
(8位)
-128 ~ 127127+1应该等于-128
unsigned char
(8位)
0 ~ 2550-1应该等于255
long
(32位)
-2147483648 ~ 2147483647
≈ 2*10的9次方
unsigned long
(32位)
0 ~ 4294967295
≈ 4*10的9次方
long long
(64位)
-9223372036854775808 ~ 9223372036854775807
≈ 9*10的18次方
unsigned long long
(64位)
0 ~ 18446744073709551615
≈ 1*10的19次方
float
(32位)
double
(64位)
long double
(64位)
     

第1章 预备知识

1.1 C++简介

语言编程方式
C语言POP
C++POP、OOP(类class)、泛型编程(模板template)

请添加图片描述

1.2 C++简史

1.2.2 C语言编程原理

数据是程序使用和处理的信息;而算法是程序使用的方法。
请添加图片描述

1.2.3 面向对象编程

POP强调的是算法;而OOP强调数据。
OOP三大特性:封装、继承、多态
一个类里有属性(变量)和方法(函数)。
请添加图片描述

1.2.4 C++和泛型编程

泛型编程强调独立于特定数据类型
比如一个排序函数:有对整型数据的排序,有对浮点型数据的排序,数据类型很多,就需要写很多个针对不同数据类型的排序函数,而泛型编程可以只写一个泛型函数,并将其用于各种实际类型当中。
请添加图片描述

1.2.5 C++的起源

C++是C语言的超集,C++是包含C的,是C的扩充版本。
任何有效的C程序都是有效的C++程序。
请添加图片描述

1.3 可移植性和标准

1.3.2 本书遵循的C++标准

详尽介绍C++98,并涵盖一些C++11新增的一些特性。
请添加图片描述

1.4 程序创建的技巧

编程步骤:
1.使用文本编辑器编写程序—源代码
2.用编译器编译源代码,生成目标代码—目标代码
3.将目标代码和其他代码链接起来—链接
4.生成最终的可执行代码—可执行代码
请添加图片描述
请添加图片描述

1.4.1 创建源代码文件

扩展名:.cpp

1.4.2 编译和链接

1.UNIX编译和链接
2.Linux编译和链接
Linux系统中最常用的编译器是g++。
后续的课程都是在Linux的Ubuntu上进行的。

3.Windows命令行编译器
4.Windows编译器
5.Macintosh上的C++(苹果系统)

第2章 开始学习C++

2.1 编辑/编译/运行第一个c++程序 + 注释

2.1.1 第一个c++程序

(代码见home/reus/Documents/C++_Primer_Plus/2#/1.cpp)
①用nano编辑1.cpp文件;//nano的使用方法见Linux实操篇—二’、文本编辑器nano
②gcc是编译C语言的,g++是用来编译C++的
③编译生成**.out文件
④执行
.out**文件
请添加图片描述

2.1.2 注释

单行注释+多行注释:
请添加图片描述

2.1.3 预处理器和iostream文件

请添加图片描述

2.1.4 头文件名cmath和math.h

请添加图片描述

2.1.5 名称空间std

请添加图片描述

2.2 初识运算符重载(<<) + 变量声明和赋值

2.2.1 初识运算符重载

(代码见home/reus/Documents/C++_Primer_Plus/2#/1.cpp)
P18:
请添加图片描述
请添加图片描述

2.2.2 变量声明+赋值

P22:
请添加图片描述
案例:
请添加图片描述
代码:
请添加图片描述

2.3 输入指令cin + 类简介

2.3.1 cin

(代码见home/reus/Documents/C++_Primer_Plus/2#/2.cpp)
案例:
请添加图片描述
注意:1.cpp和2.cpp编译后的文件都是a.out文件,所以如果要执行1.cpp的内容,就要重新对1.cpp进行编译。
所以要养成习惯:在执行.out文件之前,先对.cpp文件进行编译。
请添加图片描述

文件2.cpp代码:
请添加图片描述

2.3.2 使用cout拼接

请添加图片描述

2.3.3 类简介

一个类里有属性(变量)和方法(函数)。
cin和cout就是iostream类的一个对象。

2.4 函数

(代码见home/reus/Documents/C++_Primer_Plus/2#/3.cpp)
C++程序应当为程序中使用的每个函数提供函数原型:
如果是自定义的函数,就应该在main函数之前声明自定义的函数名称(见2.4.2);
如果是库函数,就应该在main函数之前包含对应的头文件(例如:要使用sqrt()函数,就要在main函数之前声明头文件cmath)(见2.4.1)。

2.4.1 调用库函数

案例:
请添加图片描述
代码:
请添加图片描述

2.4.2 自定义函数

案例:
请添加图片描述
代码:
请添加图片描述

2.5 总结

本章节比较简单,故没有总结。

2.6 复习题(重新看第11题)

1.C++程序的模块叫什么?
—函数
2.#include的功能是什么?
—包含iostream头文件,将头文件内容添加到源代码中
3.using namespace std;的功能是什么?
—using是预编译器指令,使用std命名空间
4.输出“hello,Linux。”并换行
—cout << “Hello world” << endl;
5.创建名为cheeses的整型变量
—int cheeses;
6.将值32赋给变量cheeses
—cheeses = 32;
7.将从键盘输入的值读入变量cheeses中
—cin >> cheeses;
8.(cout拼接)输出一个整型变量和一个字符串,并换行
—cout << “We have " << cheeses << " varities of cheese,” << endl;
9.C++中函数原型主要包含三方面的内容:函数名、参数列表、返回值
①int froop(double t); ②void rattle(int n); ③int prunt(void);
1)函数名叫froop,带有一个参数t,参数类型是double类型,并且函数返回一个整型值
2)函数名叫rattle,带有一个参数n,参数类型是int类型,该函数无返回值
3)函数名叫prune,函数无参数,函数返回一个整型值
10.什么情况下可以不用谢return?
—当函数没有返回值时,void rattle(int n)
11.假如main函数中包含以下代码:cout << “Please enter your PIN:”; 编译器指出cout是一个未知标识符,原因可能是什么?并写出三种修复这种问题的方法。
原因:没有使用std名称空间
修复方法:
1)using namespace std;//using编译指令
2)using std::cout;//using声明
3)std::cout

2.7 编程练习

(代码见home/reus/Documents/C++_Primer_Plus/2#/4.cpp)
请添加图片描述

第3章 处理数据

3.1 简单变量

3.1.1 变量名命名规则

请添加图片描述

3.1.2 整型char、short、int、long、long long

请添加图片描述

对于计算机而言,可表示的整数变量并不是无限大,而是有范围的。
请添加图片描述

补充:位bit与字节byte

位(bit):计算机内存的基本单位,0表示关,1表示开。
字节(byte):1B=8bit,1KB=1024B,1MB=1024KB,1GB=1024MB

3.1.3 运算符sizeof() + 头文件climits

(代码见home/reus/Documents/C++_Primer_Plus/3#/1.cpp)

sizeof()

sizeof()返回字节数,括号里可以是类型名,也可以是变量名
在这里插入图片描述

头文件climits

头文件climits定义了符号常量来表示类型的限制。
请添加图片描述
请添加图片描述
案例:
请添加图片描述

初始化(C语言和C++)

请添加图片描述

C++11初始化方式(不推荐)

请添加图片描述

3.1.4 无符号类型unsigned + 预处理语句#define(类似宏定义)

只有当数值不会为负时才可以使用无符号类型,如人口、粒数等。
注意:只写一个unsigned就默认表示unsigned int。
请添加图片描述

案例①:short 和 unsigned short

(代码见home/reus/Documents/C++_Primer_Plus/3#/2.cpp)
unsigned short:0~65535,0-1应该等于65535
short:-32768~32767,32767+1应该等于-32768
用Visual C++ 6.0 和 VS2019编译,结果就是对的,但在Linux上编译,结果却是下面的样子:
请添加图片描述
请添加图片描述

结论:short类型有点特殊,(具体解释见**3.4.4 类型转换—③表达式中的转换—整型提升)
再在Linux上测试下int类型试一下(案例②)

案例②:int 和 unsigned int

(代码见home/reus/Documents/C++_Primer_Plus/3#/3.cpp)
unsigned int:0 ~ 4294967295, 0-1应该等于4294967295
int:-2147483648 ~ 2147483647, 2147483647+1应该等于-2147483648
请添加图片描述
这个结果就对了,所以说short类型比较特殊

3.1.5 数据类型选择

请添加图片描述
请添加图片描述

3.1.6 不同的进制数(二进制、八进制、十六进制)

(代码见home/reus/Documents/C++_Primer_Plus/3#/4.cpp)
不管值是10、012还是0xA,最终都以二进制的形式存储在计算机中。

用cout输入不同进制(默认输出十进制)

请添加图片描述
代码:

#include<iostream>
#include<bitset>
using namespace std;

int main(){
//用cout输出不同进制:
	int m = 26;
	cout << dec << "26的十进制数是:" << m << endl;//26
	cout << hex << "26的十六进制数是:" << m << endl;//1a
	cout << oct << "26的八进制数是:" << m << endl;//32
	cout << "26的二进制数是:" << bitset<sizeof(int) * 2>(m) << endl;//00011010

	return 0;	
}

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

后缀是l或L:long常量
后缀是u或U:unsigned int常量
后缀是ul或lu或LU或UL:unsigned long常量
请添加图片描述

3.1.8 char类型—C++转义字符列表

(代码见home/reus/Documents/C++_Primer_Plus/3#/5.cpp)

C++转义序列的编码

请添加图片描述

成员函数cout.put()

请添加图片描述

三种实现换行的代码

请添加图片描述

signed char 和 unsigned char

char用作数值类型:
unsigned char:0~255
signed char:-128~127
char用作字符类型:有无符号都行。
请添加图片描述

综合案例:

char c = ‘a’;//char用作字符类型
signed char d = -80;//char用作char数值类型
unsigned char e = 200;//char用作unsigned char数值类型
请添加图片描述
当d和e的范围超出界限时,输出就会出错:
请添加图片描述

3.1.9 bool类型

bool flag = true;//真
flag = false;//假
bool flag1 = 10;//真
flag1 = -2;//假

3.2 const限定符—定义符号常量

用const定义符号常量,比#define要好;
用const创建符号常量时要同时进行初始化,const int m = 10; 这样m就不能再变了。
请添加图片描述

3.3 浮点数

3.3.1 书写方式

第一种是常用的标准小数点表示法;
请添加图片描述
第二种是E表示法:
请添加图片描述

3.3.2 浮点数类型—float 和 double

C++对于**有效位数(即精确度)**的要求是:
float至少32位;
double至少48位,且不少于float;
long double至少和double一样多。
通常,float为32位(4字节),double为64位(8字节)

float的精度比double低,系统确保float至少有6位有效位,double至少有13位是精确的。

这两段话一个说float的有效位数是32位,一个又说float至少有6位有效位,这是怎么回事呢?
答:两种说法都没错,第一段的32位是指二进制的位数,第二段的6位是指十进制的位数。

floatdouble
精确度(十进制)至少6位至少13位
精确度(二进制)至少32位至少64位
具体的解释见3.3’ 浮点数的存储 + 浮点数为什么不精确

3.3.3 浮点常量

请添加图片描述

3.3.4 浮点数的优缺点

(代码见home/reus/Documents/C++_Primer_Plus/2#/6.cpp)
优点:①可以表示整数之间的值;②可以表示的范围更大。
缺点:运算速度慢,并且在运算过程中精度会降低(更多案例见3.4.1中的案例)。
案例:
请添加图片描述
问题在于:2.34e16是一个小数点左边有16位的数字,已经超过了float的精度(一般是6位),所以在第16位加个1对于变量a来说没有任何影响,所以b-a的结果是0。

3.3’ 浮点数的存储 + 浮点数为什么不精确

问题①:浮点数在系统中是如何存储的?

int型数字5存在系统中就是0101
那么float数字8.25存在系统中是如何存储的呢?
先将float数以二进制的科学记数法形式表示出来:1.00001 * 2³
然后将其对应到 float的IEEE标准中。
float的IEEE标准:
在这里插入图片描述

转换过程各部分的名称float数8.25
整数部分(十进制)8
整数部分(二进制)1000
小数部分(十进制)0.25
科学小数部分的计算过程0.25 * 2=0.5 取整数部分0;
0.5 * 2=1.0 取整数部分1
计数小数部分(二进制)01
二进制表示1000.01
二进制科学记数法表示1.00001 * 2³,其中指数是3
尾数(小数)部分的前几位是00001
IE符号位(1位)0(0表示正数,1表示负数)
EE指数位(8位)127+指数3=130,130的二进制位10000010
尾数部分/小数部分(23位)00001后面全是0,一共23位
存储在系统中的内容为0 10000010 00001000000000000000000
        
问1:指数位为什么是127?
答:指数位一共是8位,范围是0~255,其中0 ~126表示负次幂,127 ~255表示正次幂,8.25的指数是3,所以用127+3=130,再算出130的二进制数:10000010。
问2:为什么只有尾数部分,而没有整数部分?
答:因为用二进制的科学计数法表示的整数部分都是1,所以就没有存储了。
请添加图片描述
小工具:
请添加图片描述

问题②:float的精度为什么比不上double?

先来解决3.3.2 浮点数类型—float 和 double的问题,为什么一个说float的有效位数是32位,一个又说float至少有6位有效位?
答:两种说法都没错,第一段的32位是指二进制的位数,第二段的6位是指十进制的位数。

floatdouble
精确度(十进制)至少6位至少13位
精确度(二进制)至少32位至少64位
float的这个6位和32位怎么能对应上呢?
答:float的32位中有23位是尾数部分(小数部分),再加整数部分的那个1,一共是24位,每4位二进制数对应1位十进制数,所以24/4=6,这样就对应上了。

double的IEEE标准:
请添加图片描述
同理,double的这个13位和64位怎么能对应上呢?
答:double的64位中有52位是尾数部分(小数部分),再加整数部分的那个1,一共是53位,每4位二进制数对应1位十进制数,所以53/4≈13,这样就对应上了。

综上所述,就能解释为什么float的精度比不上double了,因为float的小数部分是23位,而double的小数部分是52位。

问题③:浮点数为什么不精确?

再来一个例子:

转换过程各部分的名称float数11.17
整数部分(十进制)11
整数部分(二进制)1011
小数部分(十进制)0.17
科学小数部分的计算过程0.17 * 2=0.34 取整数部分0
0.34 * 2=0.68 取整数部分1
0.68 * 2=1.36 取整数部分1
0.36 * 2=0.72 取整数部分0
0.72 * 2=1.44 取整数部分1
0.44 * 2=0.88 取整数部分0
0.88 * 2=1.76 取整数部分1
0.76 * 2=1.52 取整数部分1
0.52 * 2=1.04 取整数部分1
0.04 * 2=0.08 取整数部分0
0.08 * 2=0.16 取整数部分0
0.16 * 2=0.32 取整数部分0
0.32 * 2=0.64 取整数部分0
…(无穷尽)
IEEE标准中float的小数部分是23位,double的小数部分是52位,而上表中小数部分的计算是无穷尽的,所以这个23位和52位根本无法记录这么多位,所以虽说double的精度很高,但对于计算机来说无法准确的表达出11.17这个小数点后只有两位的浮点数,这样说来计算机中的float型数11.17就更加不准确了。

综上所述,计算机中存储的浮点数都是近似值,只能说double比float更接近真实值

更多的案例:

转换过程各部分的名称float数26.0float数0.75float数-2.5
整数部分(十进制)2602
整数部分(二进制)11010010
小数部分(十进制)0.00.750.5
科学小数部分的计算过程0.0 * 2=0.0 取整数部分0;
0.0 * 2=0.0 取整数部分0
0.75 * 2=1.5 取整数部分1;
0.5 * 2=1.0 取整数部分1
0.5 * 2=1.0 取整数部分1
计数小数部分(二进制)0000111
二进制表示11010.000.1110.1
二进制科学记数法表示1.1010 * 2的四次方,其中指数是4
尾数(小数)部分的前几位是101000
1.1 * 2的-1次方,其中指数是 -1
尾数(小数)部分的前几位是1
1.01 * 2的1次方,其中指数是 1
尾数(小数)部分的前几位是01
IE符号位(1位)0(0表示正数,1表示负数)01
EE指数位(8位)127+指数4=131,131的二进制为10000011127-1=126,126的二进制数是01111110127+1=128,128的二进制数是10000000
尾数部分/小数部分(23位)101000后面全是0,一共23位100后面全是0,共23位01000后面全是0,一共23位
存储在系统中的内容为0 10000011 101000000000000000000000 01111110 100000000000000000000001 10000000 01000000000000000000000
        

3.4 C++算术运算符 + - * / %

3.4.1 案例 + 运算优先级和结合性

(代码见home/reus/Documents/C++_Primer_Plus/2#/7.cpp)
请添加图片描述

案例解释①:ostream类的方法setf()

cout.setf(ios_base::fixed,ios_base::floatfield);
通常cout会删除结尾的零,例如将float数33.250000显示为33.25,为了能更好地了解精度,就调用了ostream类的一个方法setf(),它可以防止程序自动把交大的制切换为E表示法,并使程序显示到小数点后6位
(补充:如果编译器不接受setf()中的ios_base,就用ios
请添加图片描述

案例解释②:和为什么是61.419998而不是61.42

因为float类型的有效位数是6位,6位之后就不准确了,这就是3.3.4 浮点数的优缺点中提到的在运算过程中,浮点数的精确度是在降低的
请添加图片描述

(注意:如果用double类型,结果就是61.420000)
请添加图片描述

运算优先级和结合性

优先级:*/高于±
结合性:从左向右

3.4.2 除法分支 + 运算符重载简介

除法分支

请添加图片描述
(代码见home/reus/Documents/C++_Primer_Plus/2#/8.cpp)
请添加图片描述

运算符重载

使用相同的符号进行多种操作叫做运算符重载(operator overloading)
C++有一些内置的重载示例(比如下图中的除法运算符),C++还允许扩展运算符重载,以便能够用于用户自定义的数据类型(类)。
请添加图片描述

3.4.3 求模运算符

必须是两个整数才可以进行求模运算。
10 / 3 = 3 //除法运算
10 % 3 = 1 //取模运算

3.4.4 类型转换

①初始化和赋值进行的转换:

short-->long	//正确
int-->float		//正确
float-->double	//正确
double-->float	//数据会丢失
float-->int		//数据会丢失
long-->short	//数据会丢失

(代码见home/reus/Documents/C++_Primer_Plus/2#/9.cpp)
请添加图片描述
解释:
将3.0赋值给变量m;
将3.14的小数部分直接丢弃,把3赋给变量l(C语言初始化方式);
将2.56的小数部分直接丢弃,把2赋给变量n(这种初始化方式是C++所特有的,具体见3.1.3–初始化(C语言和C++)

②以{ }方式初始化时进行的转换(C++11)(这种赋值方式不推荐–3.1.3)

请添加图片描述
例子:
请添加图片描述
说明:上面的第五个例子
x = 31325;char c5 = x;
编译没问题,因为对系统而言,这个例子符合赋值操作的语法,所以可以通过编译,但具体赋值之后会出现什么结果就不清楚了,然而上面第1个和第4个例子直接就是错误的代码,编译都过不了。

③表达式中的转换

当同一个表达式中包含两种不同的算术类型时,C++将执行两种自动变换:一种是类型在出现时便会自动变换(见I.整型提升);另一种是和其他类型同时出现在表达式中将被转换(见II.被动转换)。

I.整型提升

这样里有一个新的概念:整型提升(integral promotion)。
在计算表达式时,C++将bool、char、unsigned char、signed char和short值转换为int,这些转换被称为整型提升。

比如下图例子中的line3,当执行line3的语句时,C++程序取得chickens和ducks的值,将他们转换为int,然后把计算的结果转换成short类型。

(通常将int类型作为计算的类型,就意味着可能在使用这种类型时,计算机的计算速度最快。)
请添加图片描述
补充:
这下就可以理解为什么3.1.4–案例①中为什么(m+1=32768;n-1=-1)了,因为一旦涉及计算,系统就会把m转换成int型。

II.被动转换

当不同类型进行算术运算时,也会进行一些转换,都是将级别低的转换成级别高的。
级别从高到低:
long double > double > float > int ;
有符号整型:long long > long > int > short > signed char ;
无符号整型和有符号整型相同;
类型char、signed char、unsigned char的级别相同;
类型bool的级别最低。
请添加图片描述

④参数传递时的转换

这个是在后面的函数会用到。

⑤强制类型转换

三种方式:
C语言:(typeName) value
C++:typeName (value)
C++:static_cast< typeName>(value)

C语言:(typeName) value 和 C++:typeName (value)

请添加图片描述

C++:static_cast(value)

请添加图片描述
(代码见home/reus/Documents/C++_Primer_Plus/2#/10.cpp)
请添加图片描述
书上还有一个案例:
要注意区分是先计算再进行强制类型转换,还是先强制类型转换然后才计算。
请添加图片描述
书上的解释:
请添加图片描述

3.4.5 C++11中的auto声明

请添加图片描述

3.5 总结

C++的基本类型:整型(3.1)、浮点型(3.3);
算术运算:加、减、乘、除和求模(取余/取模)(3.4)
请添加图片描述

3.6 复习题(重新看第2( c)、6、7、9、10(e)题)

(第6、9题的代码见home/reus/Documents/C++_Primer_Plus/2#/11.cpp)
1.为什么C++有多种整型?
答:int, short, long, long long, unsigned char , signed char
根据数据运算的需要选择合适的数据类型和应用进行匹配

2.声明与下述描述相符的变量。
a.short整数,值为80
b.unsigned int数,值为42110
c.值为3000000000的整数
答:
a)short a = 80;
b)unsigned int b = 42110;
c)int的最大值≈2*10的9次方,所以要用unsigned int或者long或者long long:
unsigned int c = 3000000000; long c = 3000000000; long long c = 3000000000;

3.C++提供了什么措施来防止超出整型的范围?
答:C++语言没有提供自动防止超出整数类型范围的功能,需要程序员自己预估数据大小并选择合适的数据类型,每种数据类型的宽度,C++并没有做规定,具体的值由开发平台和编译器决定。

4.33L与33之间有什么区别?
答:默认C++整数常量在不超出int类型范围的应用情况下,默认优先使用int类型
33:int类型
33L:以long类型来存储整数常量

5.下面两条C++语句是否等价?
char grade = 65; 和 char grade = ‘A’;
答:在基于ASCII的平台下,两者是等价的,但是char grade = 65; 先将65存储为int类型,然后再类型转换,将int转换为char存储在grade

6.如何使用C++来找出编码88表示的字符?指出至少两种方法。
答:
1)初始化方式:
char ch = 88; cout << ch << endl;
2)强制类型转换方式:
cout << (char)88 << endl; 或者
cout << char(88) << endl; 或者
static_cast(88)

请添加图片描述

7.将long值赋给float变量会导致舍入误差,将long值赋给double变量呢?将long long值赋给double变量呢?
答:

floatdouble
精确度(十进制)至少6位至少13位
精确度(二进制)至少32位至少64位

float型是4字节,尾数部分是23位;double型是8字节,尾数部分是52位。 (有效位数是尾数部分的位数???)
字节少的赋给字节多的不会出现舍入误差,反之会出现舍入误差。

不同的平台和编译器对应的long和long long类型的大小是不同的:
如果long长度为4字节/32位,则存放在double类型(52位)中不会出现舍入误差
如果long long类型为8字节/64位,则存放在double类型(52位)中会出现舍入误差
请添加图片描述

8.下列C++表达式的结果分别是多少?
答:
a) 89+2 = 74
b) 6
3/4 = 4
c) 3/46 = 0
d) 6.0
3/4 = 4.5
e) 15%4 = 3

9.假设 x1 和 x2 是两个double变量,
(1)您要将它们作为整数相加,再将结果赋给一个整型变量。请编写一条完成这项任务的C++语句。
(2)如果要将他们作为double值相加并转换为int呢?
答:考察强制类型转换;
(1)先强制类型转换,再相加:
int sum = (int)x1 + (int)x2; 或者 int sum = int(x1) + int(x2);
(2)先相加再强制类型转换:
int sum = (int)(x1 + x2); 或者 int sum = int(x1+x2);

int sum = x1 + x2;这个应该也行吧???—可以的
请添加图片描述

10.下面每条语句声明的变量都是什么类型?
请添加图片描述
答:
a)cars—>int
b)iou --> float
c)level --> char
d)crat —> char32_t
e)fract --> double???8.25f为float类型,2.5位double类型,所以fract变量为double类型。

3.7 编程练习

都是关于单位转换的题目,第三题注意一下;
用int/int的时候如果把结果赋给float型,要在int型数前加个(float)进行强制类型转换,否则结果会出错。
请添加图片描述

第4章 复合类型

见链接

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ Primer Plus(嵌入式公开课)---1-3章 的相关文章

  • 机器人运动控制-上位机通讯

    机器人 xff0c 无论是工业机器人还是服务机器人等多种类机器人 xff0c 都有自己的控制器 在他们的控制面板上 xff0c 我们可以通过简单的操作和程序指令 xff0c 让机器人自行运动 为了让机器人更加智能 xff0c 我们需要在机器
  • Imu误差模型、零偏、零偏稳定性

    原文链接 零偏 xff0c 零偏稳定性和零偏重复性 xff0c IMU误差模型 什么是零偏 xff08 Bias xff09 在陀螺静止时 xff0c 陀螺仪仍会 xff0c 以规定时间内测得的输出量平均值相应的等效输入角速率表示 xff0
  • 海思3516a实现OSD叠加水印

    文章目录 前言一 三个文件的编译二 海思SDK使用步骤1 创建叠加字符2 添加叠加区域到视频通道 总结 前言 两天的努力终于实现了 xff0c 激动 xff01 在网上查阅了各种资料 xff0c 只是有零散的信息 xff0c 海思3516a
  • 结合下图,说明UART的工作原理

    结合下图 xff0c 说明UART的工作原理 UART提供三个独立的异步串行I O口 xff0c 他们可以运行于中断模式或者DMA模式 xff0c 也就是说UART可以产生中断请求或者DMA请求 xff0c 以便在CPU和UART之间传输数
  • 深入理解计算机系统 -- 大端与小端字节序

    一 大端字节序 vs 小端字节序 字节序指一个多字节对象在内存中存储的方式 xff0c 小端字节序机器在存储多字节对象时采用低地址存低有效字节的策略 xff0c 大端则恰恰相反 字节序由CPU架构决定 xff0c 与操作系统无直接关系 像常
  • TCP连接建立

    TCP 一种面向来连接的 可靠的 基于字节流的传输层通信协议 面向连接 xff1a 数据在发送之前必须在两端建立连接 xff0c 方法就是我们熟知的三次握手连接 可靠传输 xff1a 通过多种机制来保证数据的正确传输 xff0c 比如序列号
  • UDP接收端收不到广播的消息问题排查

    网络调试助手可以互相发送 xff0c 而你的UDP广播代码却不行 你是广播 是不会被路由器转发的 但是在同一个交换机下 是可以收到广播的 还有就是 电脑的虚拟网卡会拦截广播操作 xff0c 因为你没有指定一个地址 xff0c 所以代码正确的
  • STM32带FIFO的DMA传输应用示例

    STM32系列芯片都内置DMA外设 xff0c 其中很多系列的DMA配备了FIFO 这里以STM32F429芯片及开发板为例 xff0c 演示一下带FIFO的DMA传输实现过程 大致情况是这样的 xff0c 我用TIMER1通道1的比较事件
  • 两种方式判断内存的大小端存储方式

    1 目的 xff1a 判断ubuntu操作系统的内存属于大端还是小端存储 2 源代码 两种方法判断大小端 xff08 处理器取值时的字节序 xff09 xff1a 1 字符指针 2 联合体 法1 if 1 include lt stdio
  • 字符串:求str1在str2中首次出现的位置。

    span class token macro property span class token directive keyword include span span class token string lt stdio h gt sp
  • 基于ROS利用客户端和服务端实现C++节点和python节点间传送图像

    基于ROS利用客户端和服务端实现C 43 43 节点和python节点间传送图像 配置ROS下和python3通信以及配置python3可用的cv bridge 环境安装和使用 参考 xff1a https blog csdn net qq
  • iMaxB6充电介绍

    iMaxB6是一款多用途充电器 xff0c 能够为Li ion Li Poly Li Fe Ni Cd Ni MH和Pb类型电池充电 xff0c 支持6串以内的平衡充电 简要步骤 xff1a 1 连接正负电源 xff1b 2 连接平衡线 x
  • 基于stm32串口环形缓冲队列处理机制

    原文链接 xff1a 基于stm32串口环形缓冲队列处理机制 入门级 xff08 单字节 xff09 串口环形缓冲区实验 1 1 实验简介 最简单的串口数据处理机制是数据接收并原样回发的机制是 xff1a 成功接收到一个数 xff0c 触发
  • 源码安装nginx 1.23.1

    先看看仓库们 yum list nginx 已加载插件 xff1a fastestmirror langpacks Loading mirror speeds from cached hostfile base mirrors aliyun
  • Sublime Text运行C和C++程序

    原文链接 xff1a Sublime Text运行C和C 43 43 程序 Sublime Text 是一款当下非常流行的文本编辑器 xff0c 其功能强大 xff08 提供有众多的插件 xff09 界面简洁 还支持跨平台使用 xff08
  • keilC51编译常见错误和警告说明

    如对编译出错感兴趣的网友能否把你们常遇到的错误信息收集起来并提出最终的解决办法加以归纳以期共享 xff01 1 L15 重复调用 WARNING L15 MULTIPLE CALL TO SEGMENT SEGMENT PR SPI REC
  • RS485的电路以及相关波形

    1 RS485的电路 xff0c 要注意RE引脚一般是和DE引脚接在一起的 2 差分信号AB的波形 xff0c 高电平6 2v左右 xff0c 低电平 3v 3 A点的波形 4 B点波形 5 接收RX的波形
  • Ubuntu安装cmake

    Ubuntu18 04安装cmake 转载自https www cnblogs com yanqingyang p 12731855 html 一 使用安装命令 span class token function sudo span apt
  • C/C++混淆点-strcat和strcpy区别

    一 原因分析 假设 xff1a char str 61 NULL str 61 new char 11 你想为字符串str开辟一个存储十个字符的内存空间 xff0c 然后你现在有两个字符串 xff1a char c1 61 34 abc 3
  • QGC 添加电机测试功能

    组装过程中为了测试电机的连接以及转向 xff0c 现将电机测试功能单独制作一个页面 xff0c 以便使用 一 xff0c 效果 原型 实际效果总是差那么一丢丢 二 xff0c 实现思路 MavlinkConsole 功能 xff0c 可以在

随机推荐