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)20101
+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)205
+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的nostu1.name="張三";//張三賦值給stu1的namestu1.age=18;//18賦值給stu1的agecout<<"學號:"<<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
轉換統一進制后再計算