?? c++從零開始(二)——何謂表達式.txt
字號:
C++從零開始(二)——何謂表達式
文章錄入:7747.Net 責(zé)任編輯:7747.Net 更新時間:2008-10-7 23:57:20 430
【字體:小 大】
本篇是此系列的開頭,在學(xué)英語時,第一時間學(xué)的是字母,其是英語的基礎(chǔ)。同樣,在C++中,所有的代碼都是通過標識符(Identifier)、表達式(Expression)和語句(Statement)及一些必要的符號(如大括號等)組成,在此先說明何謂標識符。
標識符 標識符是一個字母序列,由大小寫英文字母、下劃線及數(shù)字組成,用于標識。標識就是標出并識別,也就是名字。其可以作為后面將提到的變量或者函數(shù)或者類等的名字,也就是說用來標識某個特定的變量或者函數(shù)或者類等C++中的元素。
比如:abc就是一個合法的標識符,即abc可以作為變量、函數(shù)等元素的名字,但并不代表abc就是某個變量或函數(shù)的名字,而所謂的合法就是任何一個標識符都必須不能以數(shù)字開頭,只能包括大小寫英文字母、下劃線及數(shù)字,不能有其它符號,如,!^等,并且不能與C++關(guān)鍵字相同。也就是我們在給一個變量或函數(shù)起名字的時候,必須將起的名字看作是一個標識符,并進而必須滿足上面提出的要求。如12ab_C就不是一個合法的標識符,因此我們不能給某個變量或函數(shù)起12ab_C這樣的名字;ab_12C就是合法的標識符,因此可以被用作變量或函數(shù)的名字。
前面提到關(guān)鍵字,在后續(xù)的語句及一些聲明修飾符的介紹中將發(fā)現(xiàn),C++提供了一些特殊的標識符作為語句的名字,用以標識某一特定語句,如if、while等;或者提供一些修飾符用以修飾變量、函數(shù)等元素以實現(xiàn)語義或給編譯器及連接器提供一些特定信息以進行優(yōu)化、查錯等操作,如extern、static等。因此在命名變量或函數(shù)或其他元素時,不能使用if、extern等這種C++關(guān)鍵字作為名字,否則將導(dǎo)致編譯器無法確認是一個變量(或函數(shù)或其它C++元素)還是一條語句,進而無法編譯。
如果要讓某個標識符是特定變量或函數(shù)或類的名字,就需要使用聲明,在后續(xù)的文章中再具體說明。
數(shù)字
C++作為電腦編程語言,電腦是處理數(shù)字的,因此C++中的基礎(chǔ)東西就是數(shù)字。C++中提供兩種數(shù)字:整型數(shù)和浮點數(shù),也就是整數(shù)和小數(shù)。但由于電腦實際并不是想象中的數(shù)字化的(詳情參見《C++從零開始(三)》中的類型一節(jié)),所以整型數(shù)又分成了有符號和無符號整型數(shù),而浮點數(shù)則由精度的區(qū)別而分成單精度和雙精度浮點數(shù),同樣的整型數(shù)也根據(jù)長度分成長整型和短整型。
要在C++代碼中表示一個數(shù)字,直接書寫數(shù)字即可,如:123、34.23、-34.34等。由于電腦并非以數(shù)字為基礎(chǔ)而導(dǎo)致了前面數(shù)字的分類,為了在代碼中表現(xiàn)出來,C++提供了一系列的后綴進行表示,如下:
u或U
表示數(shù)字是無符號整型數(shù),如:123u,但并不說明是長整型還是短整型
l或L
表示數(shù)字是長整型數(shù),如:123l;而123ul就是無符號長整型數(shù);而34.4l就是長雙精度浮點數(shù),等效于雙精度浮點數(shù)
i64或I64
表示數(shù)字是長長整型數(shù),其是為64位操作系統(tǒng)定義的,長度比長整型數(shù)長。如:43i64
f或F
表示數(shù)字是單精度浮點數(shù),如:12.3f
e或E
表示數(shù)字的次冪,如:34.4e-2就是0.344;0.2544e3f表示一個單精度浮點數(shù),值為254.4
當什么后綴都沒寫時,則根據(jù)有無小數(shù)點及位數(shù)來決定其具體類型,如:123表示的是有符號整型數(shù),而12341434則是有符號長整型數(shù);而34.43表示雙精度浮點數(shù)。
為什么要搞這么多事出來,還分什么有符號無符號之類的?這全是因為電腦并非基于數(shù)字的,而是基于狀態(tài)的,詳情在下篇中將詳細說明。
作為科學(xué)計算,可能經(jīng)常會碰到使用非十進制數(shù)字,如16進制、8進制等,C++也為此提供了一些前綴以進行支持。
在數(shù)字前面加上0x或0X表示這個數(shù)字是16進制表示的,如:0xF3Fa、0x11cF。而在前面加一個0則表示這個數(shù)字是用8進制表示的,如:0347,變?yōu)槭M制數(shù)就為231。但16進制和8進制都不能用于表示浮點數(shù),只能表示整型數(shù),即0x34.343是錯誤的。
字符串 C++除了提供數(shù)字這種最基礎(chǔ)的表示方式外,還提供了字符及字符串。這完全只是出于方便編寫程序而提供的,C++作為電腦語言,根本沒有提供字符串的必要性。不過由于人對電腦的基本要求就是顯示結(jié)果,而字符和字符串都由于是人易讀的符號而被用于顯示結(jié)果,所以C++專門提供了對字符串的支持。
前面說過,電腦只認識數(shù)字,而字符就是文字符號,是一種圖形符號。為了使電腦能夠處理符號,必須通過某種方式將符號變成數(shù)字,在電腦中這通過在符號和數(shù)字之間建立一個映射來實現(xiàn),也就是一個表格。表格有兩列,一列就是我們欲顯示的圖形符號,而另一列就是一個數(shù)字,通過這么一張表就可以在圖形符號和數(shù)字之間建立映射。現(xiàn)在已經(jīng)定義出一標準表,稱為ASCII碼表,幾乎所有的電腦硬件都支持這個轉(zhuǎn)換表以將數(shù)字變成符號進而顯示計算結(jié)果。
有了上面的表,當想說明結(jié)果為“A”時,就查ASCII碼表,得到“A”這個圖形符號對應(yīng)的數(shù)字是65,然后就告訴電腦輸出序號為65的字符,最后屏幕上顯示“A”。
這明顯地繁雜得異常,為此C++就提供了字符和字符串。當我們想得到某一個圖形符號的ASCII碼表的序號時,只需通過單引號將那個字符括起來即可,如:'A',其效果和65是一樣的。當要使用不止一個字符時,則用雙引號將多個字符括起來,也就是所謂的字符串了,如:"ABC"。因此字符串就是多個字符連起來而已。但根據(jù)前面的說明易發(fā)現(xiàn),字符串也需要映射成數(shù)字,但它的映射就不像字符那么簡單可以通過查表就搞定的,對于此,將在后續(xù)文章中對數(shù)組作過介紹后再說明。
操作符
電腦的基本是數(shù)字,那么電腦的所有操作都是改變數(shù)字,因此很正常地C++提供了操作數(shù)字的一些基本操作,稱作操作符(Operator),如:+ - * / 等。任何操作符都要返回一個數(shù)字,稱為操作符的返回值,因此操作符就是操作數(shù)字并返回數(shù)字的符號。作為一般性地分類,按操作符同時作用的數(shù)字個數(shù)分為一元、二元和三元操作符。
一元操作符有:
+
其后接數(shù)字,原封不動地返回后接的數(shù)字。如: +4.4f的返回值是4.4;+-9.3f的返回值是-9.3。完全是出于語義的需要,如表示此數(shù)為正數(shù)。
-
其后接數(shù)字,將后接的數(shù)字的符號取反。如: -34.4f的返回值是-34.4;-(-54)的返回值是54。用于表示負數(shù)。
!
其后接數(shù)字,邏輯取反后接的數(shù)字。邏輯值就是“真”或“假”,為了用數(shù)字表示邏輯值,在 C++中規(guī)定,非零值即為邏輯真,而零則為邏輯假。因此3、43.4、'A'都表示邏輯真,而0則表示邏輯假。邏輯值被應(yīng)用于后續(xù)的判斷及循環(huán)語句中。而邏輯取反就是先判斷“!”后面接的數(shù)字是邏輯真還是邏輯假,然后再將相應(yīng)值取反。如:
!5的返回值是0,因為先由5非零而知是邏輯真,然后取反得邏輯假,故最后返回0。
!!345.4的返回值是1,先因345.4非零得邏輯真,取反后得邏輯假,再取反得邏輯真。雖然只要非零就是邏輯真,但作為編譯器返回的邏輯真,其一律使用1來代表邏輯真。
~
其后接數(shù)字,取反后接的數(shù)字。取反是邏輯中定義的操作,不能應(yīng)用于數(shù)字。為了對數(shù)字應(yīng)用取反操作,電腦中將數(shù)字用二進制表示,然后對數(shù)字的每一位進行取反操作(因為二進制數(shù)的每一位都只能為1或0,正好符合邏輯的真和假)。如~123的返回值就為-124。先將123轉(zhuǎn)成二進制數(shù)01111011,然后各位取反得10000100,最后得-124。
這里的問題就是為什么是8位而不是16位二進制數(shù)。因為123小于128,被定位為char類型,故為8位(關(guān)于char是什么將下篇介紹)。如果是~123ul,則返回值為4294967172。
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -