先導:
目錄
一、整形
二、浮點型
!保留指定小數位數?
三、布爾類型
關系運算
邏輯運算
?C++邏輯運算四句口訣?
四、字符型
ASCll碼?
C++中的字符表示
字符比較
ASCII中的常用轉換
大小寫轉換
轉換成0~25
五、數據類型隱式轉換
?1. 隱式轉換的通用規則?
?2. 隱式轉換的優先級?
?示例:算術運算時的隱式轉換?
?3. 整數提升(Integer Promotion)??
?4. 算術轉換(Arithmetic Conversion)??
一、整形
我們平常最常見的整形是int,它占4個字節 ,也就是32比特,可表示的范圍為~
,如果是 unsigned int,即沒有負數區間,表示范圍為
~
。
cout << sizeof(int) << endl << sizeof(1234)輸出:
4
4
如果我們存儲的數字范圍超過int了,那么我們就可以使用long long。long long占8個字節
cout << sizeof(123456789123456789) << endl << sizeof(long long);輸出:
8
8
有的時候我們需要把int轉換為long long,我們可以將一個數字乘上1LL或者加上后綴ll或LL。
cout << sizeof(1234 * 1LL);
輸出:
8
在實際編程過程中,如果需要多次使用 long long,我們可以通過 typedef 關鍵字將 long long 重命名為 ll?
使用格式:typedef long long ll;
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a;
int main(){cin >> a;cout << sizeof(a);return 0;
}
輸出:
8
另外,在C++ primer是這樣規定的:sizeof(short) ≤ sizeof(int) ≤ sizeof(long) ≤ sizeof(long long),但是各個數據類型的具體長度,則是由編譯器自行決定的。
在我們考試的系統中,short 占 2 個字節,long 占 8 個字節。
二、浮點型
名稱 | 數據類型 | 字節數 | 數據范圍 | 有效位數 |
---|---|---|---|---|
單精度浮點數 | float | 4B | -3.4e38~3.4e38 | 6~7位 |
雙精度浮點數 | double | 8B | -1.7e308~1.7e308 | 15~16位 |
長雙精度浮點數 | long double | 16B | -1.2e4932~1.2e4932 | 18~19位 |
float 占 4 字節,保留有效位數 7 位,double 占 8 字節,保留有效位數 16 位。一般在算法競賽中,我們都使用 double。
其中,浮點型默認為double類型,跟long long一樣,也可以通過后綴f、F(單精度浮點型)、L(長雙精度浮點型)。
cout << sizeof(1.11) << endl;
cout << sizeof(1.11f) << endl;
cout << sizeof(1.11F) << endl;
cout << sizeof(1.11L) << endl;輸出:
8
4
4
16
!保留指定小數位數?
?注意:
- 使用setprecision保留小數位數時,需要引入頭文件
#include <iomanip>
- 必須加 fixed,否則實際輸出位數可能會小于指定保留位數。
- 以上所有格式化控制符只對緊跟在其后的數據有作用。
#include <iostream>
#include <iomanip>
using namespace std;
const double P = 3.1415;
int main(){cout << P << endl;cout << setprecision(5) << P << endl; //錯誤示范,此處必須要加fixedcout << setprecision(6) << 3.14159265358 << endl;cout << fixed << setprecision(3) << P << endl;cout << fixed << setprecision(5) << P << endl;return 0;
}
輸出為:?
? ? 3.1415
? ? 3.1415
? ? 3.14159
? ? 3.142
? ? 3.14150
三、布爾類型
名稱 | 數據類型 | 字節數 | 數值范圍 |
---|---|---|---|
布爾 | bool | 1B | true或false |
布爾變量聲明和賦值:
bool a = true, b = false;
bool a, b;
bool a = 0, b = 1;
//注意,同之前的一樣,每個變量只能被定義聲明一次,這里只是為了方便演示
輸出的bool類型,并不會輸出true或者false,而是輸出1或0,其中,true是1,false是0。一個非零數定義成bool的時候為true,但輸出是1!!!
cout << bool(0.2) << endl; //輸出:1
bool a = -1, b = 0;
cout << a << " " << b; //輸出:1 0
int c = bool(3), d = false;
cout << c << " " << d << endl; //輸出1 0
關系運算
大小關系 | C++關系運算符 | 數學符號 |
---|---|---|
大于 | > | |
小于 | < | |
大于等于 | >=? ? ?? | |
小于等于 | <= | |
等于 | == | |
不等于 | != |
重點來了:
數值A? ?關系運算符? ?數值B(表達式的值:布爾值)
什么意思呢?讓我們來看幾個例子
比如表達式
1 > 2
1顯然比2小,所以這個表達式的值為false(否)
(a = 3) == 3
這個式子中,先把a賦值成了3,再判斷a是不是等于3,這個結果肯定是true
有一個比較容易判斷錯的式子:(1 < 2)== false
這個式子的值為false。首先,我們先解析括號中的式子:1<2,這個式子的結果肯定為真,而真與假矛盾了,所以這個式子肯定為假
記住這個四句口訣,輕松搞定多重關系運算符的真假判斷:
?🎯 口訣速記?
- ?括號優先算?(先算括號內)
- ?比較從左看?(同級從左到右)
- ?賦值返右邊?(
=
返回賦值結果) - ?真值對比干?(
true/false
直接比)
?🌰 例子秒懂?
(a=3)==3
→ ?真?(口訣3:賦值返右邊,a=3
返回3
,再比3==3
)(1<2)==false
→ ?假?(口訣1+4:先算1<2
得true
,再比true==false
)
?**? 避坑提醒**?
- 小心**賦值
=
和比較==
**別混淆! - 遇到
<
、>
等比較符,?從左到右依次算。
用這口訣,再復雜的表達式也能秒拆解! ?
邏輯運算
邏輯運算符 | 含義 |
---|---|
&& | 邏輯與,如果兩個表達式的值都為真,就返回真,否則,就返回假 |
|| | 邏輯或,兩個表達式有一個表達式的值為真,就返回真 |
! | 邏輯非,如果表達式為真,就返回假。表達式為假,就返回真 |
邏輯運算真值表(1表示表達式的值為真,0表示假):
A | B | A && B | A || B | A ! B |
---|---|---|---|---|
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 0 |
0 | 1 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 1 |
?
重點又又又來了🙂:
布爾值A? ?邏輯運算符? ?布爾值B(表達式的值:布爾值)
大家一定要牢記于心,我們來看看一些例題:
判斷一個數a是否滿足,有很多初學者會這樣寫:
2 <= a <= 17
?但這是大錯特錯的,在C++中,程序是順序執行的,它會先執行2<=a,不論結果如何,返回的一定是一個布爾值,可布爾值如何跟17進行比較,所以我們要用上邏輯運算符,這樣寫:
2 <= a && a <= 17
只有兩種條件都滿足了,也就是滿足了,結果才為真。
判斷一個數是否是3或5的倍數:
a % 3 == 0 || a % 5 == 0
?C++邏輯運算四句口訣?
- ??"非先算,與或后"??(
!
?>?&&
?>?||
) - ??"或一真,與全真"??(
||
?一真即真,&&
?全真才真) - ??"區間判,與相連"??(
a>=2 && a<=17
) - ??"整除判,或相連"??(
num%3==0 || num%5==0
)
?🌰 例子秒懂?
!flag && (x>5)
?→ 先算!flag
,再算&&
(口訣1)age>=18 || score>90
?→ 滿足一個即真(口訣2)2<=a && a<=17
?→ 區間必須用&&
(口訣3)n%3==0 || n%5==0
?→ 3或5的倍數(口訣4)
? 核心:優先級+短路求值+區間寫法,四句搞定所有邏輯判斷! ?
在寫邏輯表達式時,一定要注意優先級,如果優先級靠后的那個運算符,一定要加括號!
?對于布爾類型,需要研究的知識有很多,這對于以后的基礎都非常重要,小編之后也會帶著大家一起練習。
四、字符型
字符常量是由單個字符組成,所有字符采用 ASCII 編碼,通用 ASCII 編碼共有?128?個字符。在程序中通常用一對單引號將單個字符括起來表示一個字符常量。如:'a','0','A'。
名稱 | 數據類型 | 字節數 | 數據范圍 |
---|---|---|---|
字符 | char | 1B | -128~127 |
無符號字符 | unsigned char | 1B | 0~255 |
ASCll碼?
ASCII碼:它是一種基礎的字符編碼標準,用7位二進制數(即0~127的十進制范圍)表示128個字符。
- ?標準ASCII(0~127)??:
- ?0~31?:控制字符(如換行
\n
、制表符\t
、回車\r
等)。 - ?32~126?:可打印字符:
- 32:空格(
- 48~57:數字
0
到9
- 65~90:大寫字母
A
到Z
- 97~122:小寫字母
a
到z
- 其他:標點符號(如
!
,@
,#
等)。
- 32:空格(
- ?127?:刪除控制字符(DEL)。
- ?0~31?:控制字符(如換行
- ?擴展ASCII(128~255)??:非標準,依賴系統(如Windows-1252),表示特殊符號(如
é
,?
等)。
C++中的字符表示
char a = 'A';//存儲ASCII值65
cout << a << endl;
char a = 65;//定義a在ASCII中為A
cout << a;輸出:
A
A
我們可以使用轉義字符,來實現一些輸出(不要求掌握后兩個)
名稱 | 字符形式 | 值 |
---|---|---|
換行 | \n | 0X0A |
水平制表 | \t | 0X09 |
反斜杠 | \\ | 0X5C |
#include <bits/stdc++.h>
using namespace std;
int main(){cout << "大家好\n我是\t小貓\\";return 0;
}
大家可以運行看看
字符比較
這部分就要用到之前講過的關系運算了,大家可以復習一下。(注意,這里我們所講的是字符,不是字符串,字符串之間的比較方式為字典序)
字符比較和數字之前的比較一樣,都是返回表達式的值為真還是假,但是字符比較的不是字符,而是ASCII中字母所代表的數字,舉一些例子:
- 表達式'a'>'b'的值,a在ASCII中為97, b為98,a應該比b小,這個表達式的值為假
- '0'<'2',這個的值顯然為真,因為48<50
在這里要補充一點,字符和字符之間是可以進行運算的,參與運算的也是每個字母代表的ASCII值,結果也是數字,如'b'+1的結果是99。
ASCII中的常用轉換
大小寫轉換
我們可以根據ASCII中的規律進行大小寫轉換,我們可以發現,大寫字母和小寫字母之間ASCII值只差了32(注意,小寫字母轉化成大寫字母時,需要減去32,反之,則加上32),這樣,就實現了C++中的大小寫轉換。
#include <bits/stdc++.h>
using namespace std;
int main(){char a = 'A';char b = a + 32;cout << a << endl << b;return 0;
}
轉換成0~25
有時,我們為了看起來更方便一些,可以把字母轉換成對應的0~25。怎么操作呢?對于小寫字母,我們只要把對應的字母減去一個'a';對于大寫字母,我們我們只要把對應的字母減去一個'A'
#include <bits/stdc++.h>
using namespace std;
int main(){char a = 'C';cout << a - 'A' << endl;char b = 'c';cout << b - 'a' << endl;
}
注意!!!ASCII只針對于英文,中文無效
五、數據類型隱式轉換
隱式轉換是指在編程語言中,由編譯器自動執行的類型轉換過程,而無需顯式指定。這種轉換是為了保持操作的一致性,使不同類型的數據能夠在一些特定的上下文中進行運算或操作。隱式轉換通常涉及到較小范圍數據類型向較大范圍數據類型的轉換,以避免數據丟失或提高精度。
?1. 隱式轉換的通用規則?
隱式轉換通常發生在以下情況:
- ?賦值時?(
=
) - ?算術運算時?(
+
,?-
,?*
,?/
) - ?函數調用時?(參數類型不匹配)
- ?初始化時?(如?
int x = 3.14;
)
編譯器會按照從低精度到高精度、從小范圍到大范圍的原則自動轉換數據類型,以避免數據丟失。
?2. 隱式轉換的優先級?
C++的隱式轉換遵循類型提升(Type Promotion)?規則,優先級如下(從低到高):
?數據類型? | ?提升方向? | ?示例? |
---|---|---|
bool | →?int | true ?→?1 ,?false ?→?0 |
char ,?short | →?int | 'A' ?→?65 |
int | →?unsigned int | -1 ?→?4294967295 (32位系統) |
int | →?long | int ?→?long (如果?int ?范圍不足) |
int | →?float | 5 ?→?5.0f |
float | →?double | 3.14f ?→?3.14 |
double | →?long double | 3.14 ?→?3.14L |
?示例:算術運算時的隱式轉換?
int a = 5;
float b = 3.14f;
auto result = a + b; // int → float(a提升為float)
cout << result; // 輸出 8.14(float類型)
?3. 整數提升(Integer Promotion)??
在算術運算中,?比?int
?小的整型(如?char
、short
)會被提升為?int
:
char c = 'A'; // ASCII 65
short s = 100;
auto sum = c + s; // char → int, short → int(運算結果為int)
cout << sum; // 輸出 165(int類型)
?4. 算術轉換(Arithmetic Conversion)??
如果兩個操作數類型不同,C++會按照以下規則轉換:
- ?如果有一個操作數是?
long double
,另一個轉換為?long double
。?? - ?否則,如果有一個操作數是?
double
,另一個轉換為?double
。?? - ?否則,如果有一個操作數是?
float
,另一個轉換為?float
。?? - ?否則,進行整數提升(
char
/short
?→?int
),然后按以下規則轉換:??- 如果一個是?
unsigned long
,另一個轉換為?unsigned long
。 - 如果一個是?
long
,另一個是?unsigned int
:- 如果?
long
?能表示所有?unsigned int
?值,則?unsigned int
?→?long
。 - 否則,兩者都轉換為?
unsigned long
。
- 如果?
- 如果一個是?
long
,另一個轉換為?long
。 - 否則,如果一個是?
unsigned int
,另一個轉換為?unsigned int
。 - 否則,兩者都轉換為?
int
。
- 如果一個是?
這就是所以內容了,內容較多,大家需要多多理解。下期我們一起練習,掌握它😄
整篇文章碼字不易,大家能不能點個贊💗呢,謝謝
有什么問題可以在評論區討論👬
備注:文章中有部分圖片來自于百度