前言
每一種編程語言都會提供一些與其他語言不同的特性,這也是它產生的原因,但是作為編程語言,它也會保留所有編程語言的共性,例如一些基本類型,整形,浮點型,字符等,還有變量、表達式和控制流,所有的編程語言這些部分都不會有很大差異。
基本數據類型
基本的數據類型是每一個語言的基礎,數據的類型決定了數據的含義以及數據所支持的操作,不同的數據類型相同的操作結果可能完全不同,例如同樣的表達式a + b,如果a和b是整型,那么a + b的結果就是二者的和,如果a和b是字符串,a + b的結果就是字符串的拼接。C++提供了很多基本的數據類型,大致可以分為兩類,一類是算數類型如整型和浮點型等,一類的是特殊的void類型,void類型沒有關聯的值,只用于一些特殊的場景,例如函數沒有返回值。
算術類型
C++提供了以下的算術基本類型,C++的算術基本類型又可以分為整數類型和浮點型,其具體情況如下,數據類型占據的空間與平臺相關,表中是最小占據的空間。
類型 | 說明 | 最小空間 |
---|---|---|
bool | 布爾類型 | NA |
char | 字符類型 | 8bits |
w_char_t | 長字符類型 | 16bits |
char16_t | unicode 字符 | 16bits |
char32_t | uincode 字符 | 32bits |
short | 短整型 | 16bits |
int | 整型 | 16bits |
long | 長整型 | 32bits |
long long | 長整型 | 64bits |
float | 單精度浮點型 | 6位有效數字 |
double | 雙精度浮點型 | 10位有效數字 |
long double | 擴展精度浮點型 | 10位有效數字 |
signed和unsigned
除了布爾類型和擴展字符類型,整型可以是有符號的也可是無符號的,short,int, long這些都是默認有符號的,有符號整型存儲的時候第一個數字代表符號,其可以是負的,也可以是正的。無符號類型都是大于或等于0的,想獲得無符號整型只需要在相應的類型前加上unsigned即可,如unsigned short。
需要注意的是char也有三個類型,char, unsigned char和signed char,說是三種類型其實只有兩種類型就是無符號字符和有符號字符,其中char是有符號或無符號是與編譯器相關的,所以在使用char時最好注明是有符號還是無符號的。
和C語言一樣,C++也是非常接近硬件的語言,為了適應很多品類繁多的硬件,應該通過更加嚴格的類型定義來避免歧義,在不同的硬件上行為保持一致。在選擇類型時有以下幾條意見:
- 如果明確不會為負時使用無符號類型。
- 在使用整型時通常使用int,short通常太小,long通常和int大小相同,如果值大于int規定的占最小空間的最大值則使用longlong。
- 盡量不要直接使用char,而是使用unsigned char和signed char,因為char是有符號或是無符號在不同編譯器上是不同的。
- 對于浮點數盡量使用double,因為float進度通常不夠,而且在一些機器上double運算要比float快。
類型轉換
在程序中操作數的類型是由其值和使用形式所共同決定的,類型轉換是指操作數的類型會自動轉換為我們所希望的類型,這么說可能有點抽象,以例子說明,42在正常使用過程是整型,可以實現各種算術操作,但是在以下情況會 轉化為布爾類型。
# include
int main(){
if (42) {
std::cout<<"42是布爾類型"<
當我們將一個算術類型轉化為一個非算術類型,其結果取決于其值的范圍:
- 當將一個非布爾類型的值賦予一個布爾類型的值時,如果該值等于0則是false,反之則是true。
- 當將一個bool類型的值賦予一個非bool類型的值時,如果是true則轉化為1,false則轉化為0。
- 當將一個浮點型的值賦予一個整型,該值則會被截斷,只會保留小數點前的整數部分。
- 當將一個整型的值賦予一個浮點型,其小數部分則為0.
- 當賦予一個無符號類型超出其范圍的值,其結果就是該值除余該類型最大值的結果,如將-1賦予8bit的unsiged char,其結果就是255。
- 當賦予一個有符號類型一個超出其范圍的值,其結果不可知,可能正常運行,可能會crash,也有可能產生垃圾數據。
表達式中包含無符號類型
雖然我們不希望將一個負值賦予無符號類型,但是這個錯誤很容易在無意識的情況下觸發,例如在一個算數表達式中如果包含無符號數和符號數,其會將符號數自動轉化為無符號數,其例子如下。
# include
int main() {
int a = -40;
unsigned b = 10;
std::cout<return 0;
}
[
其結果為
4294967266
20
還有就是在循環中使用無符號數,可能會造成死循環,例子如下,當i為-1時會轉化為無符號數,會一直循環下去。
# include
int main() {
for (unsigned i = 11; i >= 0; --i) {
std::cout<
?盡量不要將無符號數與符號數混用,如果混用要確保其不會超出范圍。
?
變量
變量是用來存儲程序操作的數據,C++是一個強類型的語言,在聲明一個變量時必須要指定其類型,聲明的類型決定其在內存中存儲方式以及可以執行的操作。C++的聲明變量的方式很簡單,首先是數據類型,后面跟著一個或多個變量名,也可以在聲明時初始化(可選),變量名以逗號隔開,最后以分號結尾
int a = 0, b, c;
?初始化并不等于賦值,初始化是指在變量被創建時賦予其一個值,而賦值是指改變變量當前的值并賦予其一個新值。
?
初始化
C++有很多的初始化方式,如下就有三種初始化方法。
# include
int main() {
int a = 0;
int b = {0};
int d(0);
std::cout<
當一個變量在聲明時沒有主動進行初始化時,會賦予一個默認初始化值,其值取決于它的位置和類型,內置類型如果沒有初始化且不在任何函數體內,則其值為0,如果在函數體內則是undefined,獲取或者操作undefined值可能會發生未知的錯誤。
聲明與定義
C++支持獨立編譯,也就是說C++支持將我們的程序分割為多個文件,且每個文件都能獨立編譯,當我們將程序分割為多個文件時就牽扯到文件間的數據共享,一個文件可能需要使用其他文件定義的變量,例如我們使用std::cout,為了支持這種獨立編譯,C++將聲明與定義分割開,聲明是指讓程序知道這個名字,當一個文件需要使用一個變量時,只要引入此變量的聲明即可,定義是指創建相關的實體。聲明是指確定了類型與名字,但是并未賦值,連默認的賦值都沒有,也沒有申請內存,而定義則是申請兩內存,也賦值兩。為了區分聲明和定義,C++提供了extern關鍵字。
extern int i ;//聲明里但未定義
int j;//聲明且定義了
]()
-
編程語言
+關注
關注
10文章
1945瀏覽量
34733 -
字符
+關注
關注
0文章
233瀏覽量
25207 -
C++
+關注
關注
22文章
2108瀏覽量
73642
發布評論請先 登錄
相關推薦
評論