电脑基础 · 2023年3月1日

c++ 每日十问3-处理数据

1.为什么 C++有多种整型?
解析:
C++语言中包含多种整数类型,主要包括 short、int、long 和 long long 这4种,每一种还分别包含有符号类型和无符号类型(unsigned)。此外,char 类型也可以看作一种小整数类型。C++语言中这些整数类型的主要区别在于存储使用的数位长度不同,其中 short 类型最少 16 位长度;int 类型至少和 short 类型一样长:long 类型至少 32 位,且至少和 int 类型一样长;long long 类型至少 64 位且至少和 long 类型一样长。由于存储数据使用的数位长度不同,因此这4种类型能够表示的最大整数值存在差异。此外,有符号类型能够表示负数:无符号类型不能不表示负数,且表示的最小值为 0。同一种类型的有符号数和无符号数的最大值与最小值也存在不同。因此,在程序设计中应当根据数据运算的需要选择合适类型的整型数据。

2.声明与下述描述相符的变量。

a. short 整数,值为 80。
b. unsigned int 整数,值为 42 110。

c.值为3000 000 000 的整数。
解析:
C++中变量声明的基本格式是先标识数据类型,后标识变量名,变量的初始化可以通过声明语句中的赋值运算符实现。本题中为了声明相应的变量,需要首先考虑其数据类型是否符合题目要求。理论上 C++程序设计中变量的数据类型可以使用位数较大的类型,不能够使用位数较小的数据类型来描述较大的数值。但是为了节省存储空间通常选用与数值相匹配的数据类型。
a.题目中数据常量 80 是一个整数,在 short int 的取值范围内,因此可以使用 short int 类型。 short example a= 80;b. 题目中的数值 42 110 超过了 short 的取值范围,也超过了16位有符号的int类型的最大值 32 767,因此可以使用 unsigned int 类型。声明方式如下。
unsigned int example b=42110;或者
unsigned example b = 42110;
c.题目中变量的初始值为3000 000000,超过了unsignedint类型的取值范围,因此应当使用 unsigned long 类型或者 long long类型表示该数值。声明方式如下。
unsigned long example c=3000 000000;或者
long long example_c = 3 000 000 000;

3.C++提供了什么措施来防止超出整型的范围?

解析:
C++语言中 short、int、long 和 long long 类型的主要区别在于存储的字节长度不同,因此每种类型的最大值不同。但是C++语言中并没有提供自动防止超出整数类型范围的功能需要程序员预先估计数据大小与哪种数据类型匹配。同时,C++语言标准并未明确规定每一种整数类型的宽度,其具体数值应当由开发平台和编译器决定,可以使用头文件中的climits来确定实际的最大值。

4.33L 与33 之间有什么区别?
解析:
C++语言中整型字面值具有一个默认类型,除非数值超过了 int 类型的最大值。通常整型字面值的默认类型为 int 类型,程序设计中也可以通过在常量后添加后缀来指定整型常量的具体类型,例如,L 后缀表示 long 类型,U 后缀表示unsigned 类型。此外,也可以组合使用 U和 L 来表示 unsigned long 类型。因此,本题目中常量33表示int 型数据,33L表示 long 型数据,两者在计算机内占用的存储空间不同。两者在存储空间上的具体差异由实现平台决定。

5.下面两条 C++语句是否等价? char grade = 65; char grade = 'A';

解析:
本题中的两条声明语句都声明了字符类型的变量grade,并将其初始化为'A'。在基于ASCII 码的平台下两条语句可以通用,不基于 ASCI 码的平台下则两者不能通用。此外 C++中两条语句的具体实现也稍有区别。第1条语句中65是一个int类型的数据常量,初始化过程中会进行类型转换,即将整型数据 65 转换成字符类型,再存储到 grade 内,数位宽度会变化。第2条语句直接将变量 grade 初始化为字符类型的数据常量'A。

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

解析:
编程过程中要查找与 ASCI 编码对应的字符,一般可以直接查询 ASCH 码表。该方法的优点是能够查找所有对应的 ASCI 字符。此外,也可以通过编写简单语句查询。通过语句查询的缺点是某些不可见字符无法显示。本题中可以通过 C++语句查询,具体方法如下。
char example = 88; cout<<example<<endl;
以上语句通过 char 类型变量直接输出。 cout<<(char) 88<<endl;
通过C风格的强制类型转换,将整型数据 88 转换为 char 类型并输出。 cout<<char(88)<<endl;
通过 C++类型的强制类型转换,将整型数据 88 转换为 char 类型并输出。 cout.put(char(88));
通过 cout.put()函数直接输出类型强制转换后的 char 数据。

7.将long 值赋给 float 变量会导致舍入误差,将 long 值赋给 double 变量呢? 将 long long值赋给 double 变量呢?
解析:
C++中的浮点类型数据表示带小数部分的数据,但是浮点型数据在很多情况下并不能精确表示所有数字,通常在很多平台下C++中 float类型只能够表示6位有效数字,double仅能表示15位有效数字(浮点型数据的具体有效数字范围定义在cfloat 头文件中)。因此在整型数据转换为浮点型数据的过程中会产生舍入误差,这种误差的产生主要是由整型数据的有效数字超过了浮点型数据的表示范围引起的。long类型数据的最大值为20亿,即10位数,因此转换为 float 类型时会丢失精度,但double类型的有效数字为15位,因此不会产生舍入误差,但 long long 类型最大可以包含 19 位有效数字,转换为 double 类型可能会产生舍入误差。

8. 下列 C++表达式的结果分别是多少? a.8*9+2 b. 6*3/4 c.3/4*6 d. 6.0*3/4 e.1584

解析:
C++的算术运算符主要有加(+)、减(一)、乘(*)、除(1)和取模(%),在进行算表达式求值时主要需要注意运算符的优先级和结合性两个知识点,其中算术运算符的优生级是乘、除和取模高于加、减。当算术运算符的优先级相同时,需要考虑操作数(即参与运算的数值)的结合性是从左到右还是从右到左。对于同一个操作数,在C++中从左向右运算。此外,运算过程中对于不同类型的数据,C++会进行隐式的数据类型转换。一般的转换规则是将取值范围较小的数据转换成表达式中取值范围较大的数据类型。在此基础上可以判断题目的运算结果。
a.8*9+2 的结果 74,先计算乘法,再做加法。
b.6*3/4 的结果 4,运算符优先级相同,因此操作数从左到右结合,先计算 6*3,结果为 18,由于两个操作数是整数,因此最后的除法结果为其商,无小数部分。
c.3/4*6的结果0,运算符优先级相同,因此操作数从左到右结合,先计算314,结果为其商 0,最后做乘法,0*6为0。
d.6.0*3/4的结果为4.5,运算符优先级相同,因此操作数从左到右结合,先计算6.0*3,结果为浮点数 18.0,后计算 18.0/4,得到浮点结果4.5。
e.1584 的结果为 3,取模运算,结果为 3。

9.假设 x1 和 x2 是两个 double 变量,要将它们作为整数相加,再将结果赋给一个整型变量。请编写一条完成这项任务的 C++语句。如果要将它们作为 double 值相加并转换为 int 呢?
解析:
C++中要将浮点型数据转换成整型数据,首先舍弃小数部分,其次如果原数据大于目标类型的取值范围,结果将不确定。程序中可以使用多种形式进行强制类型转换,也可以在不同时机进行类型转换,先转换成为整型数据再进行计算和先计算再转换成整型数据可能会产生不同效果,例如,对于 1.8+1.9,先计算再进行类型转换,得到结果 3;先进行类型转换再计算,得到结果 2。这些问题在程序设计中需要特别注意。先计算再进行类型转换的语句如下所示。
int pos = int(x1+x2);或者int pos =(int)(x1+x2);先进行类型转换再计算的语句如下所示。 int pos = int(x1)+int(x2);或者
int pos =(int)x1+(int)x2;

10.下面每条语句声明的变量分别是什么类型的? a. auto cars = 15
b. auto iou = 150.37f c. auto level ='B'

d aut U'/U0002155 21 
e. auto fract = 8.25f/2.5 
解析:
C++中的关键字 auto 能够使编译器根据初始值自动推断变量的类型。
a.auto cars = 15 声明了变量 cars 并初始化为整型数据 15,因此 auto 关键字使编译器推断变量 cars 的类型为 int 类型。
b.auto iou = 150.37f 声明了变量 iou 并初始化为 float 类型数据 150.37f,因此 auto 关键字使编译器推断变量 iou 的类型为 float 类型。
c.auto level ='B'声明了变量并初始化为 char 类型的常量'B',因此 auto 关键字使编译器推断变量 level 的类型为 char 类型。
d.在语句auto crat=U'/U0002155'中,常量U'/U0002155'中前缀U表示该常量是 char32_t类型的数据,因此 auto 关键字使编译器推断变量 crat 为 char32t类型。
e.在语句auto fract=8.25f/2.5 中,变量 fract 初始化为表达式 8.25f/2.5 的值,该表达式中 8.25f为 float 类型,2.5 为 double 类型,除法运算产生数据类型转换,其结果为 double 类型,因此通过 auto 关键字使编译器推断 fract 变量为 double 类型。