亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C++程序設計從零開始之表達式

2019-11-17 05:05:29
字體:
來源:轉載
供稿:網友
本篇是此系列的開頭,在學英語時,第一時間學的是字母,其是英語的基礎。同樣,在C++中,所有的代碼都是通過標識符(Identifier)、表達式(EXPRession)和語句(Statement)及一些必要的符號(如大括號等)組成,在此先說明何謂標識符。


  標識符

  標識符是一個字母序列,由大小寫英文字母、下劃線及數字組成,用于標識。標識就是標出并識別,也就是名字。其可以作為后面將提到的變量或者函數或者類等的名字,也就是說用來標識某個特定的變量或者函數或者類等C++中的元素。

  比如:abc就是一個合法的標識符,即abc可以作為變量、函數等元素的名字,但并不代表abc就是某個變量或函數的名字,而所謂的合法就是任何一個標識符都必須不能以數字開頭,只能包括大小寫英文字母、下劃線及數字,不能有其它符號,如,!^等,并且不能與C++要害字相同。也就是我們在給一個變量或函數起名字的時候,必須將起的名字看作是一個標識符,并進而必須滿足上面提出的要求。如12ab_C就不是一個合法的標識符,因此我們不能給某個變量或函數起12ab_C這樣的名字;ab_12C就是合法的標識符,因此可以被用作變量或函數的名字。

  前面提到要害字,在后續的語句及一些聲明修飾符的介紹中將發現,C++提供了一些非凡的標識符作為語句的名字,用以標識某一特定語句,如if、while等;或者提供一些修飾符用以修飾變量、函數等元素以實現語義或給編譯器及連接器提供一些特定信息以進行優化、查錯等操作,如extern、static等。因此在命名變量或函數或其他元素時,不能使用if、extern等這種C++要害字作為名字,否則將導致編譯器無法確認是一個變量(或函數或其它C++元素)還是一條語句,進而無法編譯。

  假如要讓某個標識符是特定變量或函數或類的名字,就需要使用聲明,在后續的文章中再具體說明。

  數字

  C++作為電腦編程語言,電腦是處理數字的,因此C++中的基礎東西就是數字。C++中提供兩種數字:整型數和浮點數,也就是整數和小數。但由于電腦實際并不是想象中的數字化的(詳情參見《C++從零開始(三)》中的類型一節),所以整型數又分成了有符號和無符號整型數,而浮點數則由精度的區別而分成單精度和雙精度浮點數,同樣的整型數也根據長度分成長整型和短整型。

  要在C++代碼中表示一個數字,直接書寫數字即可,如:123、34.23、-34.34等。由于電腦并非以數字為基礎而導致了前面數字的分類,為了在代碼中表現出來,C++提供了一系列的后綴進行表示,如下:

  u或U 表示數字是無符號整型數,如:123u,但并不說明是長整型還是短整型

  l或L 表示數字是長整型數,如:123l;而123ul就是無符號長整型數;而34.4l就是長雙精度浮點數,等效于雙精度浮點數

  i64或I64 表示數字是長長整型數,其是為64位操作系統定義的,長度比長整型數長。如:43i64

  f或F 表示數字是單精度浮點數,如:12.3f

  e或E 表示數字的次冪,如:34.4e-2就是0.344;0.2544e3f表示一個單精度浮點數,值為254.4

  當什么后綴都沒寫時,則根據有無小數點及位數來決定其具體類型,如:123表示的是有符號整型數,而12341434則是有符號長整型數;而34.43表示雙精度浮點數。

  為什么要搞這么多事出來,還分什么有符號無符號之類的?這全是因為電腦并非基于數字的,而是基于狀態的,詳情在下篇中將具體說明。

  作為科學計算,可能經常會碰到使用非十進制數字,如16進制、8進制等,C++也為此提供了一些前綴以進行支持。

  在數字前面加上0x或0X表示這個數字是16進制表示的,如:0xF3Fa、0x11cF。而在前面加一個0則表示這個數字是用8進制表示的,如:0347,變為十進制數就為231。但16進制和8進制都不能用于表示浮點數,只能表示整型數,即0x34.343是錯誤的。

  字符串

  C++除了提供數字這種最基礎的表示方式外,還提供了字符及字符串。這完全只是出于方便編寫程序而提供的,C++作為電腦語言,根本沒有提供字符串的必要性。不過由于人對電腦的基本要求就是顯示結果,而字符和字符串都由于是人易讀的符號而被用于顯示結果,所以C++專門提供了對字符串的支持。

  前面說過,電腦只熟悉數字,而字符就是文字符號,是一種圖形符號。為了使電腦能夠處理符號,必須通過某種方式將符號變成數字,在電腦中這通過在符號和數字之間建立一個映射來實現,也就是一個表格。表格有兩列,一列就是我們欲顯示的圖形符號,而另一列就是一個數字,通過這么一張表就可以在圖形符號和數字之間建立映射?,F在已經定義出一標準表,稱為ASCII碼表,幾乎所有的電腦硬件都支持這個轉換表以將數字變成符號進而顯示計算結果。

  有了上面的表,當想說明結果為“A”時,就查ASCII碼表,得到“A”這個圖形符號對應的數字是65,然后就告訴電腦輸出序號為65的字符,最后屏幕上顯示“A”。

  這明顯地繁雜得異常,為此C++就提供了字符和字符串。當我們想得到某一個圖形符號的ASCII碼表的序號時,只需通過單引號將那個字符括起來即可,如:'A',其效果和65是一樣的。當要使用不止一個字符時,則用雙引號將多個字符括起來,也就是所謂的字符串了,如:"ABC"。因此字符串就是多個字符連起來而已。但根據前面的說明易發現,字符串也需要映射成數字,但它的映射就不像字符那么簡單可以通過查表就搞定的,對于此,將在后續文章中對數組作過介紹后再說明。

  操作符

  電腦的基本是數字,那么電腦的所有操作都是改變數字,因此很正常地C++提供了操作數字的一些基本操作,稱作操作符(Operator),如:+ - * / 等。任何操作符都要返回一個數字,稱為操作符的返回值,因此操作符就是操作數字并返回數字的符號。作為一般性地分類,按操作符同時作用的數字個數分為一元、二元和三元操作符。

  一元操作符有:


+   其后接數字,原封不動地返回后接的數字。如: +4.4f的返回值是4.4;+-9.3f的返回值是-9.3。完全是出于語義的需要,如表示此數為正數。-   其后接數字,將后接的數字的符號取反。如: -34.4f的返回值是-34.4;-(-54)的返回值是54。用于表示負數。 !   其后接數字,邏輯取反后接的數字。邏輯值就是“真”或“假”,為了用數字表示邏輯值,在 C++中規定,非零值即為邏輯真,而零則為邏輯假。因此3、43.4、'A'都表示邏輯真,而0則表示邏輯假。邏輯值被應用于后續的判定及循環語句中。而邏輯取反就是先判定“!”后面接的數字是邏輯真還是邏輯假,然后再將相應值取反。如:

  !5的返回值是0,因為先由5非零而知是邏輯真,然后取反得邏輯假,故最后返回0。

  !!345.4的返回值是1,先因345.4非零得邏輯真,取反后得邏輯假,再取反得邏輯真。雖然只要非零就是邏輯真,但作為編譯器返回的邏輯真,其一律使用1來代表邏輯真。 ~   其后接數字,取反后接的數字。取反是邏輯中定義的操作,不能應用于數字。為了對數字應用取反操作,電腦中將數字用二進制表示,然后對數字的每一位進行取反操作(因為二進制數的每一位都只能為1或0,正好符合邏輯的真和假)。如~123的返回值就為-124。先將123轉成二進制數01111011,然后各位取反得10000100,最后得-124。

  這里的問題就是為什么是8位而不是16位二進制數。因為123小于128,被定位為char類型,故為8位(關于char是什么將下篇介紹)。假如是~123ul,則返回值為4294967172。

  為什么要有數字取反這個操作?因為CPU提供了這樣的指令。并且其還有著很不錯且很重要的應用,后面將介紹。   
  關于其他的一元操作符將在后續文章中陸續提到(但不一定全部提到)。

  二元操作符有:

+
-
*
/
%
其前后各接一數字,返回兩數字之和、差、積、商、余數。如:
34+4.4f的返回值是38.4;3+-9.3f的返回值是-6.3。
34-4的返回值是30;5-234的返回值是-229。
3*2的返回值是6;10/3的返回值是3。
10%3的返回值是1;20%7的返回值是6。 &&
其前后各接一邏輯值,返回兩邏輯值之“與”運算邏輯值和“或”運算邏輯值。如:
'A'&&34.3f的返回值是邏輯真,為1;34&&0的返回值是邏輯假,為0。
0'B'的返回值是邏輯真,為 1;00的返回值是邏輯假,為0。 &

^ 其前后各接一數字,返回兩數字之“與”運算、“或”運算、“異或”運算值。如前面所說,先將兩側的數字轉成二進制數,然后對各位進行與、或、異或操作。如:
4&6的返回值是4,4轉為00000100,6轉為00000110各位相與得,00000100,為4。
46的返回值是6,4轉為00000100,6轉為00000110各位相或得,00000110,為6。
4^6的返回值是2,4轉為00000100,6轉為00000110各位相異或得,00000010,為2。 >
<
==
>=
<=
!= 其前后各接一數字,根據兩數字是否大于、小于、等于、大于等于、小于等于及不等于而返回相應的邏輯值。如:
34>34的返回值是0,為邏輯假;32<345的返回值為1,為邏輯真。
23>=23和23>=14的返回值都是1,為邏輯真;54<=4的返回值為0,為邏輯假。
56==6的返回值是0,為邏輯假;45==45的返回值是1,為邏輯真。
5!=5的返回值是0,為邏輯假;5!=35的返回值是真,為邏輯真。 >>
<<   其前后各接一數字,將左側數字右移或左移右側數字指定的位數。與前面的 ~、&、等操作一樣,之所以要提供左移、右移操作主要是因為CPU提供了這些指令,主要用于編一些基于二進制數的算法。
  <<將左側的數字轉成二進制數,然后將各位向左移動右側數值的位數,如:4,轉為00000100,左移2位,則變成00010000,得16。
  >>與<<一樣,只不過是向右移動罷了。如:6,轉為00000110,右移1位,變成00000011,得3。假如移2位,則有一位超出,將截斷,則6>>2的返回值就是00000001,為1。
  左移和右移有什么用?用于一些基于二進制數的算法,不過還可以順便作為一個簡單的優化手段。考慮十進制數3524,我們將它左移2位,變成352400,比原數擴大了100倍,準確的說應該是擴大了10的2次方倍。假如將3524右移2位,變成35,相當于原數除以100的商。
同樣,前面4>>2,等效于4/4的商;32>>3相當于32/8,即相當于32除以2的3次方的商。而4<<2等效于4*4,相當于4乘以2的2次方。因此左移和右移相當于乘法和除法,只不過只能是乘或除相應進制數的次方罷了,但它的運行速度卻遠遠高于乘法和除法,因此說它是一種簡單的優化手段。 ,   其前后各接一數字,簡單的返回其右側的數字。如:
   34.45f,54的返回值是54;-324,4545f的返回值是4545f。
  那它到底有什么用?用于將多個數字整和成一個數字,在《C++從零開始(四)》中將進一步說明。
   關于其他的二元操作符將在后續文章中陸續提到(但不一定全部提到)。
   三元操作符只有一個,為?:,其格式為:<數字1>?<數字2>:<數字3>。它的返回值為:假如<數字1>是邏輯真,返回<數字2>,否則返回<數字3>。如:
   34?4:2的返回值就是4,因為34非零,為邏輯真,返回4。而0?4:2的返回值就是2,因為0為邏輯假,返回2。
  表達式

  你應該發現前面的荒謬之處了——12>435返回值為0,那為什么不直接寫0還吃飽了撐了寫個12>435在那?這就是表達式的意義了。

  前面說“>”的前后各接一數字,但是操作符是操作數字并返回數字的符號,因為它返回數字,因此可以放在上面說的任何一個要求接數字的地方,也就形成了所謂的表達式。如:23*54/45>34的返回值就是0,因為23*54的返回值為1242;然后又將1242作為“/”的左接數字,得到新的返回值27.6;最后將27.6作為“>”的左接數字進而得到返回值0,為邏輯假。


  因此表達式就是由一系列返回數字的東西和操作符組合而成的一段代碼,其由于是由操作符組成的,故一定返回值。而前面說的“返回數字的東西”則可以是另一個表達式,或者一個變量,或者一個具有返回值的函數,或者具有數字類型操作符重載的類的對象等,反正只要是能返回一個數字的東西。假如對于何謂變量、函數、類等這些名詞感到生疏,不需要去管它們,在后繼的文章中將會一一說明。

  因此34也是一個表達式,其返回值為34,只不過是沒有操作符的表達式罷了(在后面將會了解到34其實是一種操作符)。故表達式的概念其實是很廣的,只要有返回值的東西就可以稱為表達式。

  由于表達式里有很多操作符,執行操作符的順序依靠于操作符的優先級,就和數學中的一樣,*、/的優先級大于+、-,而+、-又大于>、<等邏輯操作符。不用去刻意記住操作符的優先級,當不能確定操作符的執行順序時,可以使用小括號來進行指定。如:
((1+2)*3)+3)/4的返回值為3,而1+2*3+3/4的返回值為7。注重3/4為0,因為3/4的商是0。當希望進行浮點數除法或乘法時,只需讓操作數中的某一個為浮點數即可,如:3/4.0的返回值為0.75。

  & ^ ~等的應用

  前面提過邏輯操作符“&&”、“”、“!”等,作為表示邏輯,其被C++提供一點都不值得驚異。但是為什么要有一個將數字轉成二進制數,然后對二進制數的各位進行邏輯操作的這么一類操作符呢?首先是CPU提供了相應的指令,并且其還有著下面這個非常有意義的應用。
考慮一十字路口,每個路口有三盞紅綠燈,分別指明能否左轉、右轉及直行。共有12盞,現在要為它編寫一個控制程序,不管這程序的功能怎樣,首先需要將紅綠燈的狀態轉化為數字,因為電腦只知道數字。所以用3個數字分別表示某路口的三盞紅綠燈,因此每個紅綠燈的狀態由一個數字來表示,假設紅燈為0,綠燈為1(不考慮黃燈或其他情況)。

  后來忽然發現,其實也可以用一個數字表示一個路口的三盞紅綠燈狀態,如用110表示左轉綠燈、直行綠燈而右轉紅燈。上面的110是一個十進制數字,它的每一位實際都可以為0~9十個數字,但是這里只應用到了兩個:0和1,感覺很浪費。故選擇二進制數來表示,還是110,但是是二進制數了,轉成十進制數為6,即使當為111時轉成十進制數也只是7,比前面的110這個十進制數小多了,節約了……??什么??

  我們在紙上寫數字235425234一定比寫134這個數字要更多地占用紙張(假設字都一樣大)。因此記錄一個大的數比記錄一個小的數要花費更多的資源。簡直荒謬!不管是100還是1000,都只是一個數字,為什么記錄大的數字就更費資源?因為電腦并不是數字計算機,而是電子計算機,它是基于狀態而不是基于數字的,這在下篇會具體說明。電腦必須使用某種表示方式來代表一個數字,而那個表示方式和二進制很像,但并不是二進制數,故出現記錄大的數較小的數更耗資源,這也就是為什么上面整型數要分什么長整型短整型的原因了。

  下面繼續上面的思考。使用了110這個二進制數來表示三盞紅綠燈的狀態,那么現在要知道110這個數字代表左轉紅綠燈的什么狀態。以數字的第三位表示左轉,不過電腦并不知道這個,因此如下:110&100。這個表達式的返回值是100,非零,邏輯真。假設某路口的狀態為010,則同樣的010&100,返回值為0,邏輯假。因此使用“&”操作符可以將二進制數中的某一位或幾位的狀態提取出來。所以我們要了解一個數字代表的紅綠燈狀態中的左轉紅綠燈是否綠燈時,只需讓它和100相與即可。

  現在要保持其他紅綠燈的狀態不變,僅僅使左轉紅綠燈為綠燈,如當前狀態為010,為了使左轉紅綠燈為綠燈,值應該為110,這可以通過010100做到。假如當前狀態是001,則001100為101,正確——直行和右轉的紅綠燈狀態均沒有發生變化。因此使用“”操作符可以給一個二進制數中的某一位或幾位設置狀態,但只能設置為1,假如想設置為0,如101,要關掉左轉的綠燈,則101&~100,返回值為001。

  上面一直提到的路口紅綠燈的狀態實際編寫時可以使用一個變量來表示,而上面的100也可以用一個標識符來表示,如state&TS_LEFT,就可以表示檢查變量state所表示的狀態中的左轉紅綠燈的狀態。

  上面的這種方法被大量地運用,如創建一個窗口,一個窗口可能有二三十個風格,則通過上面的方法,就可以只用一個32位長的二進制數字就表示了窗口的風格,而不用去弄二三十個數字來分別代表每種風格是否具有。 更多文章 更多內容請看C/C++技術專題  C/C++進階技術文檔  C/C++相關文章專題,或

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91av在线网站| 亚洲国产精品大全| 亚洲福利在线视频| 久久99精品国产99久久6尤物| 亚洲国产精品一区二区三区| 免费91麻豆精品国产自产在线观看| 国产午夜精品一区二区三区| 97在线观看免费高清| 最近2019年中文视频免费在线观看| 亚洲第一福利在线观看| 狠狠色狠狠色综合日日五| 国产999精品久久久影片官网| 91精品国产综合久久久久久久久| 在线观看欧美www| 亚洲福利精品在线| 欧美激情一级精品国产| 国产精品久久久久久久久粉嫩av| 91久久在线观看| 在线观看精品国产视频| 亚洲欧美日韩一区在线| 日韩成人高清在线| 久久成人精品一区二区三区| 97**国产露脸精品国产| 日本免费久久高清视频| 国产91免费看片| 亚洲乱码一区二区| 亚洲永久在线观看| 久久久亚洲欧洲日产国码aⅴ| 欧美国产视频一区二区| 在线视频精品一| 久久久久成人网| 久久久久久久久久久人体| 一区二区三区日韩在线| 日韩免费观看网站| 全球成人中文在线| 在线播放日韩精品| 欧美电影免费播放| 日韩av在线精品| 国产精品一区二区久久精品| 精品久久久一区二区| 国产亚洲一区二区精品| 日韩精品在线视频观看| 日韩中文字幕在线精品| 97视频在线观看免费| 国产色综合天天综合网| 久久久久久成人精品| 亚洲欧美中文日韩在线v日本| 中文字幕久久久| 国产精品成人免费电影| 国产欧美精品在线播放| 欧美性视频精品| 精品久久香蕉国产线看观看亚洲| 91成人在线观看国产| 在线播放国产一区二区三区| 亚洲精品丝袜日韩| 日韩精品在线看| 国产欧美一区二区三区视频| 国产+成+人+亚洲欧洲| 亚洲伊人一本大道中文字幕| 国产精品678| 色狠狠久久aa北条麻妃| 成人精品一区二区三区电影黑人| 亚洲成人久久久| 国产精品普通话| 亚洲一区二区福利| 国内久久久精品| 亚洲女人初尝黑人巨大| 欧美成人激情在线| 亚洲精品国产精品国自产观看浪潮| 欧美中文在线免费| 亚洲欧美999| 久久久久久这里只有精品| 欧美国产视频一区二区| 日韩av在线看| 国产不卡在线观看| 久久99精品久久久久久噜噜| 国产成人精品最新| 国产日韩欧美另类| 欧美肥臀大乳一区二区免费视频| 国产一区二区三区毛片| 欧美成年人视频网站欧美| 国产精品国产三级国产aⅴ浪潮| 欧美性生活大片免费观看网址| 在线看国产精品| 国产精品扒开腿做爽爽爽视频| 久久久久国产精品一区| 欧美成人全部免费| 亚洲电影免费观看| 91香蕉亚洲精品| 日韩电影中文字幕一区| 中文字幕精品一区二区精品| 国产精品久久久久久久久久久不卡| 久久久精品久久久久| 国产精品久久久久久久久久三级| 国产91精品久久久久久久| 日韩欧美大尺度| 欧美巨猛xxxx猛交黑人97人| 亚洲一级一级97网| 日韩精品极品毛片系列视频| 日韩女优在线播放| 欧美在线视频观看免费网站| 精品成人av一区| 亚洲一区二区免费| 91久久久亚洲精品| 欧美日韩国产中文字幕| 亚洲成人网在线观看| 亚洲免费伊人电影在线观看av| 久久精品国产电影| 亚洲人成网站999久久久综合| 少妇av一区二区三区| 热久久视久久精品18亚洲精品| 久久久久久噜噜噜久久久精品| 亚洲国产精品女人久久久| 国产欧美一区二区三区在线看| 亚洲人成亚洲人成在线观看| 国产精品三级网站| 96国产粉嫩美女| 国产精品久久久av| 精品欧美国产一区二区三区| 亚洲天堂网站在线观看视频| 这里只有精品久久| 亚洲色图日韩av| 国产成人精品免费久久久久| 亚洲美女中文字幕| 国产精品7m视频| 亚洲成人精品久久久| 一本大道久久加勒比香蕉| 国产91精品青草社区| 91亚洲国产成人久久精品网站| 日av在线播放中文不卡| 国产精品日韩在线观看| 国产精品va在线播放我和闺蜜| 亚洲黄色在线观看| 91在线视频精品| 国产91av在线| 亚洲最大福利网站| 日韩成人中文电影| 欧美性猛交xxxx乱大交3| 亚洲天堂网站在线观看视频| 色综合影院在线| 成人激情视频网| 91国产中文字幕| 国产精品国产三级国产aⅴ浪潮| 一区二区亚洲精品国产| 亚洲视频在线免费观看| 国产这里只有精品| 国模精品系列视频| 亚洲最新av在线| 亚洲人精选亚洲人成在线| 国产日韩av在线| 欧美夜福利tv在线| 久久久久久国产精品| 国产精品日韩专区| 国产精品1区2区在线观看| 精品国产精品三级精品av网址| 国产精品久久久久免费a∨大胸| 免费99精品国产自在在线| 日韩视频在线免费观看| 成人啪啪免费看| 欧美国产视频日韩| 国自在线精品视频| 久久久久久久久亚洲| 亚洲裸体xxxx| 欧美一级电影久久|