PDF文档公众号回复关键字:20240607
单项选择题(共15题,每题2分,共计30分:每题有且仅有一个正确选项)
1 在C++中,下面哪个关键字用于声明一个变量,其值不能被修改?( )
A unsigned
B const
C static
D mutable
2 八进制数12345670(8) 和07654321(8)的和为( )
A 22222221(8)
B 21111111(8)
C 22111111(8)
D 22222211(8)
3 阅读下述代码,请问修改data的value成员以存储3.14,正确的方式是( )。
union Data{
int num;
float value;
char symbol;
};
union Data data;
A data.value = 3.14;
B value.data = 3.14;
C data->value = 3.14;
D value->data = 3.14;
9 数101010(2)和166(8)的和为( )
A 10110000(2)
B 236(8)
C 158(10)
D A0(16)
2 相关知识点
1) C++ 关键字
unsigned 关键字
用于声明无符号整数类型。无符号整数类型只能表示非负整数,即它们的值总是大于或等于零
例如
short是16为二进制组成,第1位是符号位,表示范围-32768~32767之间
unsigned short是16为二进制组成,无符号位, 表示范围0~65535之间
#include<bits/stdc++.h>
using namespace std;
/*
无符号关键字
short是16为二进制组成,第1位是符号位,表示范围-32768~32767之间
unsigned short是16为二进制组成,无符号位, 表示范围0~65535之间
*/
int main(){
short a=32769;//超出了short的范围
unsigned short b=32769;//在范围内可以正常表示
cout<<"a的值为:"<<a<<endl; //输出不正确
cout<<"b的值为:"<<b<<endl;
return 0;
}
/*
a的值为:-32767
b的值为:32769
*/
static 关键字
在 C 和 C++ 中,当变量被声明为 static
时,它会在程序的整个执行期间存在,而不仅仅是定义它的代码块(例如函数)的执行期间。这意味着 static
变量在函数调用之间保持其值
主要在不同作用域或对象之间共享数据
const 关键字
在 C++ 中,const
是一个类型修饰符,用于指定一个变量或对象的值是不可更改的。这意味着一旦为 const
变量分配了初始值,就不能再对其进行修改
#include<bits/stdc++.h>
using namespace std;
const int a=10;
int main(){
//改变const 关键字修饰变量的值 编译会出错
a=3;// [Error] assignment of read-only variable 'a'
cout<<a;
return 0;
}
mutable 关键字
在声明const的成员函数,不能修改成员变量,如果成员函数声明时加 mutable则可以修改
#include <iostream>
using namespace std;
class Test {
public:
Test(int c):counter(c){}//构造函数 并为counter字段赋值
/* 声明为const函数,表示不会修改类的成员属性,但是mutable的属性除外 */
int getValue() const;
private:
mutable int counter;
};
int Test::getValue() const {
counter++; // 允许在 const 成员函数中修改 mutable 成员变量
return counter;
}
int main()
{
Test mc = 1;
cout << mc.getValue() << endl;
return 0;
}
2) 进制转换
R进制转十进制
按权展开,但要注意各个位的权,最低位(最右边)的权是0次方,权值为1
(11010110)2=1×2^7+1×2^6+0×2^5+1×2^4+0×2^3+1×2^2+1×2^1+0×2^0=(214)10
十进制整数转R进制
十进制小数转R进制
二进制转八进制
二进制转换成八进制的方法是,取三合一法,即从二进制的小数点为分界点,向左(或向右)每三位取成一位
(1010 0100)B = (010 001 100 )B=(244)O
八进制转二进制
二进制转换成八进制的反向操作
(244)O=(010 001 100 )B=(1010 0100)B
二进制转十六进制
二进制转换成十六进制的方法是,取四合一法,即从二进制的小数点为分界点,向左(或向右)每四位取成一位
(10100100)B = (1010 0100)B = (A4)H
十六进制转二进制
二进制转换成十六进制的反向操作
(A4)H = (1010 0100)B =(10100100)B
3) 不同进制加法
进制不同不能直接相加,需转换成相同进制再进行相加
二进制相加
//类似十进制相加,不同的是逢二进一
5+9=14
(5)10=(0101)2,(9)10=(1001)2
0101
+1001
------
1110
二进制 1110 转10进制
(1110)2=1*2^3+1*2^2+1*2^1=14
八进制相加
//类似十进制相加,不同的是逢8进一
5+9=14
(5)10=(5)8,(9)10=(11)2
05
+11
------
16
八进制 16 转10进制
(16)8=1*8^1+6*8^0=8+6=14
4) struct 结构体
struct 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合,是一种复合数据类型,结构类型
#include<bits/stdc++.h>
using namespace std;
//定义一个结构体,可以把多个不同的变量 组织在一起
struct stu{
string no;//学号
string name;//姓名
int age;//年龄
};
int main(){
stu stu1;
stu1.no="001";//001赋值给stu1的no
stu1.name="张三";//张三赋值给stu1的name
stu1.age=18;//18赋值给stu1的age
cout<<"学号:"<<stu1.no<<endl;//输出结构体stu1的学号
cout<<"姓名:"<<stu1.name<<endl;//输出结构体stu1的姓名
cout<<"年龄:"<<stu1.age;//输出结构体stu1的年龄
return 0;
}
5) union 联合体
在 C++ 中,union 是一种特殊的数据结构,它允许在相同的内存位置存储不同的数据类型。union 可以帮助节省内存,因为它们使用相同的内存空间来存储不同的数据类型,但是只能同时存储其中一个
在定义 union 时,所有成员共享同一块内存空间。当为 union 的某个成员赋值时,会覆盖 union 中已有的值。这也是 union 的一个特点:它不会记录哪个成员是当前有效的,因此在使用 union 时,需要确保对应的成员是正确的
#include <iostream>
using namespace std;
/*
定义union联合体,联合体内多个变量共享内存
内存大小和占用空间最大的变量相同
同一时刻只有一个变量的值是有效的
*/
union MyUnion {
int i;
double d;
char c;
};
int main() {
MyUnion u;
u.i = 42;//给联合体变量i赋值
cout << "联合体变量i的值:" << u.i << endl;//输出42,其他2个变量d和c无效
u.d = 3.14159;//给联合体变量d赋值
cout << "联合体变量d的值:" << u.d << endl;//输出3.14159,其他2个变量i和c无效
u.c = 'A';//给联合体变量d赋值
cout << "联合体变量c的值:" << u.c << endl;//输出A,其他2个变量i和d无效
return 0;
}
6) 结构体(struct)和联合体(union)区别
在 struct 中,每个成员都有自己的内存空间,在 union 中,所有成员共享同一块内存空间,union 的大小取决于其最大的成员
struct 中的成员可以同时存在,每个成员都有自己的地址,union 中的成员共享相同的内存,同一时刻只能存储一个成员的值
struct 的大小等于其所有成员大小的总和,每个成员都有独立的内存空间,union 的大小等于其最大成员的大小,各变量共享内存
#include <iostream>
using namespace std;
/*
定义结构体 MyStruct
内包括3个变量,这3个变量被组织到一起,可以同时使用
*/
struct MyStruct {//占用空间必须是最大占用空间变量的整数倍
//i 占用4个字节 需要补4个字节够8个字节,因为后面够8个字节 (8)
int i;
//d 占用8个字节 (8)
double d;
//c 占用1个字节 需要补7个字节到8个字节 (8)
char c;
};//所以 MyStruct总共占用24个字节
struct MyStruct1 {//占用空间必须是最大占用空间变量的整数倍
//i 占用4个字节 需要补4个字节够8个字节,因为后面够8个字节 (8)
int i;
//d 占用8个字节 (8)
double d;
//用4个字节 和后面c一起补足8个字节 (j,c一起再补足3个字节) (8)
int j;
//c 占用1个字节
char c;
};//所以 MyStruct1总共占用24个字节
struct MyStruct2 {//占用空间必须是最大占用空间变量的整数倍
//i 占用4个字节 需要补4个字节够8个字节,因为后面够8个字节 (8)
int i;
//d 占用8个字节 (8)
double d;
//j用4个字节 补足8个字节 (8)
int j;
//d1 占用8个字节 (8)
double d1;
//c 占用1个字节 补足8个字节 (8)
char c;
};//所以 MyStruct1总共占用40个字节
/*
定义一个联合体 MyUnion
内包括3个不同类型变量 这3个变量同时只能使用一个
占用空间,联合体变量占用空间最大的变量
*/
union MyUnion {
int i;//i占用4个字节
double d;//d占用8个字节
char c;//c占用1个字节
};//联合体占用空间为8个字节
int main() {
cout << "struct占用内存空间大小:" << sizeof(MyStruct) << " bytes" << endl;
cout << "struct1占用内存空间大小:" << sizeof(MyStruct1) << " bytes" << endl;
cout << "struct2占用内存空间大小:" << sizeof(MyStruct2) << " bytes" << endl;
cout << "union占用内存空间大小:" << sizeof(MyUnion) << " bytes" << endl;
MyStruct s;
s.i = 42;
s.d = 3.14;
s.c = 'A';
cout << "Struct的值: " << s.i << ", " << s.d << ", " << s.c << endl;
MyUnion u;
u.i = 42;
cout << "联合体i的值: " << u.i << endl;
u.d = 3.14;
cout << "联合体重新赋值后d的值: " << u.d << endl;
return 0;
}
3 思路分析
1 在C++中,下面哪个关键字用于声明一个变量,其值不能被修改?( )
A unsigned
B const
C static
D mutable
答案 B
分析
unsigned 为无符号,只影响数据类型的取值范围
const 为不可修改关键字,const在变量前,此变量为常量,不能修改,修改编译会报错
static 为静态变量,被static关键字修饰后,可以在多个对象直接共享此变量,都可以修改
mutable 和const配合使用,在定义为const的函数使用mutable关键词修饰的变量,可以修改
2 八进制数12345670(8) 和07654321(8)的和为( )
A 22222221(8)
B 21111111(8)
C 22111111(8)
D 22222211(8)
答案 D
分析
由于相加的2个数都是8进制,因此可以直接相加,逢八进一
12345670
+07654321
---------
22222211
3 阅读下述代码,请问修改data的value成员以存储3.14,正确的方式是( )。
union Data{
int num;
float value;
char symbol;
};
union Data data;
A data.value = 3.14;
B value.data = 3.14;
C data->value = 3.14;
D value->data = 3.14;
答案 A
Union 为联合体,和 struct 类似,赋值应用.运算符
9 数101010(2)和166(8)的和为( )
A 10110000(2)
B 236(8)
C 158(10)
D A0(16)
答案 D
转换统一进制后再计算