2024-11-10-C++ 学习:变量和基本类型课后习题( Primer 第二章 )(选做)
C++的学习不能断,我感觉冬天了,可以刷一下 C++ primer 这本大厚书。
一、前言
C++中变量和基本类型的相关习题的学习!
二、习题
练习2.1
问题: 类型 int、long、long long和 short 的区别是什么?无符号类型和带符号类型的区别是什么?float和double的区别是什么?
答案:
- (1)在 C++语言中,int、long、long long和 short 都属于整型,区别是 C++标准规定的尺寸的最小值(即该类型在内存中所占的比特数)不同。其中,short是短整型,占16位;int是整型,占16位;long和longlong均为长整型,分别占32位和64位。C++标准允许不同的编译器赋予这些类型更大的尺寸。某一类型占的比特数不同,它所能表示的数据范围也不一样。
- (2)大多数整型都可以划分为无符号类型和带符号类型,在无符号类型中所有比特都用来存储数值,但是仅能表示大于等于0的值;带符号类型则可以表示正数、负数或 0。
- (3)float和double分别是单精度浮点数和双精度浮点数,区别主要是在内存中所占的比特数不同,以及默认规定的有效位数不同。
练习 2.3
读程序写结果
unsigned u=10,u2=42;
std::cout<u2-u< std::endl;
std::cout <<u-u2<< std::endl;
int i=10,i2=42;
std::cout<<i2-i<< std::endl;
std::cout<<i-i2<< std::endl;
std::cout <<i-u<< std::endl;
答案:
程序的运行结果是:
32
4294967264
32
-32
0
0
练习 2.5
问题
指出下述字面值的数据类型并说明每一组内几种字面值的区别:
(a)'a', L'a', "a",L"a"
(b)10,10u,10L,10uL,012,0xC
(c)3.14,3.14f,3.14L
(d)10,10u,10.,10e-2
答案
- (a)'a'表示字符 a,'a'表示宽字符型字面值a且类型是 wchar_t,"a"表示字符串 a,L"a"表示宽字符型字符串 a。
- (b )10是一个普通的整数类型字面值,10u表示一个无符号数,10L表示一个长整型数,10uL表示一个无符号长整型数,012是一个八进制数(对应的十进制数是10),0xC是一个十六进制数(对应的十进制数是12)。
- (c) 3.14是一个普通的浮点类型字面值,3.14f表示一个 float 类型的单精度浮点数,3.14L表示一个1ong double 类型的扩展精度浮点数。
- (d)10是一个整数,10u是一个无符号整数,10.是一个浮点数,10e-2 是一
个科学计数法表达形式,实际为10的-2次方,为0.1。
练习 2.10
问题
下列变量的初值分别是什么?
std::string global str;
int global int;
int main()
int local int;
std::string local str;
答案
- (1)对于string类型的变量来说,因为string类型本身接受无参数的初始化方式,所以不论变量定义在函数内还是函数外都被默认初始化为空串。
- (2)对于内置类型int来说,变量global int定义在所有函数体之外,根据 C++的规定,global int默认初始化为0;而变量 local int 定义在 main函数的内部,将不被初始化,如果程序试图拷贝或输出未初始化的变量,将遇到一个未定义的奇异值。
练习 2.19
问题 说明指针和引用的主要区别。
答案
指针“指向”内存中的某个对象,而引用“绑定到”内存中的某个对象,它们都实现了对其他对象的间接访问,二者的区别主要有两方面:
- (1)第一,指针本身就是一个对象,允许对指针赋值和拷贝,而且在指针的生命周期内它可以指向几个不同的对象;引用不是一个对象,无法令引用重新绑定到另外一个对象。
- (2)第二,指针无须在定义时赋初值,和其他内置类型一样,在块作用域内定义的指针如果没有被初始化,也将拥有一个不确定的值;引用则必须在定义时赋初值。
练习 2.27
问题 下面的哪些初始化是合法的?请说明原因。
(a)int i=-l,&r =0;
(b)int *const p2=&i2;
(c)const int i=-1,&r=0;
(d)const int *const p3 = &i2;
(e)const int *pl= &i2;
(f)const int &const r2;
(g)const int i2=i,&r=i;
答案
(a)是非法的,非常量引用r不能引用字面值常量0。
(b)是合法的,p2是一个常量指针,p2的值永不改变,即p2永远指向变量 i2。
(c)是合法的,i是一个常量,r是一个常量引用,此时r可以绑定到字面值常量0。
(d)是合法的,p3是一个常量指针,p3的值永不改变,即p3永远指向变量 i2;同时 p3指向的是常量,即我们不能通过p3改变所指对象的值。
(e)是合法的,p1指向一个常量,即我们不能通过p1改变所指对象的值
(f)是非法的,引用本身不是对象,因此不能让引用恒定不变。
(g)是合法的,12是一个常量,r是一个常量引用。
术语表(第二章)
- 地址(address) 是一个数字,根据它可以找到内存中的一个字节。
- 别名声明(alias declaration) 为另外一种类型定义一个同义词:使用“名字=类型”的格式将名字作为该类型的同义词。
- 算术类型(arithmetictype) 布尔值、字符、整数、浮点数等内置类型。
- 数组(array) 是一种数据结构,存放着组未命名的对象,可以通过索引来访问这些对象。
- auto 是一个类型说明符,通过变量的初始值来推断变量的类型。
- 基本类型(basetype) 是类型说明符,可用const修饰,在声明语句中位于声明符之前。基本类型提供了最常见的数据类型以此为基础构建声明符。
- 绑定(bind) 令某个名字与给定的实体关联在一起,使用该名字也就是使用该实体。例如,引用就是将某个名字与某个对象绑定在一起。
- 字节(byte) 内存中可寻址的最小单元:大多数机器的字节占8位。
- 类成员(class member) 类的组成部分
- 复合类型(compoundtype) 是一种类型,它的定义以其他类型为基础。
- const 是一种类型修饰符,用于说明永不改变的对象。const对象一旦定义就无法再赋新值,所以必须初始化。
- 常量表达式(constexpression) 能在编译时计算并获取结果的表达式。
- 常量指针(constpointer) 是一种指针,它的值永不改变。
- 常量引用(const reference) 是一种习惯叫法,含义是指向常量的引用。
- constexpr 是一种函数,用于代表一条常量表达式。
- 转换(conversion) 一种类型的值转变成另外一种类型值的过程。C++语言支持内置类型之间的转换。
- 数据成员(data member) 组成对象的数据元素,类的每个对象都有类的数据成员的一份拷贝。数据成员可以在类内部声明的同时初始化。
- 声明(declaration) 声称存在一个变量、函数或是别处定义的类型。名字必须在定义或声明之后才能使用。
- 声明符(declarator) 是声明的一部分,包括被定义的名字和类型修饰符,其中类型修饰符可以有也可以没有。
- decltype 是一个类型说明符,从变量或表达式推断得到类型。
- 默认初始化(default initialization) 当对象未被显式地赋予初始值时执行的初始化行为。由类本身负责执行的类对象的初始化行为。全局作用域的内置类型对象初始化为0:局部作用域的对象未被初始化即拥有未定义的值。
- 定义(defnition) 为某一特定类型的变量申请存储空间,可以选择初始化该变量。名字必须在定义或声明之后才能使用。
- 转义序列(escape sequence) 字符特别是那些不可打印字符的替代形式。转义以反斜线开头,后面紧跟一个字符,或者不多于3个八进制数字,或者字母x加上1个十六进制数。
- 全局作用域(global scope) 位于其他所有作用域之外的作用域。
- 头文件保护符(header guard) 使用预处理变量以防止头文件被某个文件重复包含。
- 标识符(identifier) 组成名字的字符序列标识符对大小写敏感。
- 类内初始值(in-class initializer) 在声明类的数据成员时同时提供的初始值,必须置于等号右侧或花括号内。
- 在作用域内(inscope) 名字在当前作用域内可见。
- 被初始化(initialized) 变量在定义的同时被赋予初始值,变量一般都应该被初始化
- 内层作用域(inner scope) 嵌套在其他作用域之内的作用域。
- 列表初始化(list initialization) 利用花括号把一个或多个初始值放在一起的初始化形式。
- 字面值(literal) 是一个不能改变的值,如数字、字符、字符串等。单引号内的是字符字面值,双引号内的是字符串字面值。
- 局部作用域(local scope) 是块作用域的习惯叫法。
- 底层 const(low-level const) 一个不属于顶层的const,类型如果由底层常量定义不能被忽略。
- 成员(member) 类的组成部分
- 不可打印字符(nonprintable character) 不具有可见形式的字符,如控制符、退换行符等。
- 空指针(nul pointer) 值为0的指针,指针合法但是不指向任何对象。
- nullptr 是表示空指针的字面值常量。
- 对象(object) 是内存的一块区域,具有某种类型,变量是命名了的对象。
- 外层作用域(outer scope) 嵌套着别的作用域的作用域。
- 指针(pointer) 是一个对象,存放着某个对象的地址,或者某个对象存储区域之后的下一地址,或者0。
- 指向常量的指针(pointer to const) 是个指针,存放着某个常量对象的地址。指向常量的指针不能用来改变它所指对象的值。
- 预处理器(preprocessor) 在C++编译过程中执行的一段程序。
- 预处理变量(preprocessor variable) 由预处理器管理的变量。在程序编译之前,预处理器负责将程序中的预处理变量替换成它的真实值。
- 引用(reference) 是某个对象的别名,
- 对常量的引用(reference to const) 是个引用,不能用来改变它所绑定对象的值对常量的引用可以绑定常量对象,或者非常量对象,或者表达式的结果。
- 作用域(scope) 是程序的一部分,在其中某些名字有意义。C++有几级作用域:
- 全局(global) 名字定义在所有其他作用域之外。
- 类(class) 名字定义在类内部。
- 命名空间(namespace) 名字定义在命名空间内部。
- 块(block) 名字定义在块内部。名字从声明位置开始直至声明语句所在的作用域末端为止都是可用的。
- **分离式编译(separate compilation)**把程序分割为多个单独文件的能力。
- 带符号类型(signed) 保存正数、负数或0的整型。
- 字符串(string) 是一种库类型,表示可变长字符序列。
- struct 是一个关键字,用于定义类。
- 临时值(temporary) 编译器在计算表达式结果时创建的无名对象。为某表达式创建了一个临时值,则此临时值将一直存在直到包含有该表达式的最大的表达式计算完成为止。
- 顶层const(top-level const) 是一个const,规定某对象的值不能改变。
- 类型别名(type alias) 是一个名字,是另外一个类型的同义词,通过关键字typedef或别名声明语句来定义。
- 类型检查(type checking) 是一个过程,编译器检查程序使用某给定类型对象的方式与该类型的定义是否一致。
- 类型说明符(type specifier) 类型的名字
- typedef 为某类型定义一个别名。当关键字typedef作为声明的基本类型出现时,声明中定义的名字就是类型名。
- 未定义(undefined) 即 C++语言没有明确规定的情况。不论是否有意为之,未定义行为都可能引发难以追踪的运行时错误安全问题和可移植性问题。
- 未初始化(uninitialized) 变量已定义但未被赋予初始值。一般来说,试图访问未初始化变量的值将引发未定义行为.
- 无符号类型(unsigned) 保存大于等于0的整型。
- 变量(variable) 命名的对象或引用。C++语言要求变量要先声明后使用。
- void* 可以指向任意非常量的指针类型,不能执行解引用操作。
- void 类型是一种有特殊用处的类型,既无操作也无值。不能定义一个 void 类型的变量。
- 字(word) 在指定机器上进行整数运算的自然单位。一般来说,字的空间足够存放地址。32位机器上的字通常占据4个字节,
- &运算符(&operator) 取地址运算符。
- *运算符(*operator) 解引用运算符。解引用一个指针将返回该指针所指的对象,为解引用的结果赋值也就是为指针所指的对象赋值。
- #define 是一条预处理指令,用于定义一个预处理变量。
- #endif 是一条预处理指令,用于结束一个#ifdef或#ifndef区域。
- #ifdef 是一条预处理指令,用于判断给定的变量是否已经定义。
- #ifndef 是一条预处理指令,用于判断给定的变量是否尚未定义。
总结
- 多做题,多思考,多记多背,加油~
代码是在 visual studio 中编写的,该软件还是比较好用的,我安装的是2022专业版;
共勉!
原文地址:https://blog.csdn.net/weixin_42269028/article/details/143661951
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!