?? 第7章 運算符、表達式、語句.htm
字號:
<P>先計算 ++a,結果a值為11;</P>
<P>然后再計算 b = a;結果b值也為11。</P>
<P> </P>
<P>例子2:</P>
<P>int b = a++; //后置++</P>
<P>運算結果:a的值為11,但b的值為10。</P>
<P>計算過程解析:</P>
<P>先計算 b = a;因此,b的值是未加1之前的a,所以為10;</P>
<P>然后再計算 a++,a的值為11。</P>
<P> </P>
<P>再舉一復雜點的表達式:</P>
<P>int a = 10;</P>
<P>int c = 5;</P>
<P> </P>
<P>int b = a++ + c;</P>
<P>執行這些代碼,b值為15</P>
<P> </P>
<P>倘若換成:</P>
<P>int a = 10;</P>
<P>int c = 5;</P>
<P>int b = ++a + c;</P>
<P>執行這些代碼,b值為16;</P>
<P>想一想,為什么?</P>
<P> </P>
<P>上在舉的是++的例子,對于--操作,其計算順序的規定一樣。</P>
<P> </P>
<P>++和--的確能加快運算速度,但它們在前置和后置運算上的微小區別,卻很空易讓你的代碼變得不清晰。更為不好的是,不同的編譯器可能會對比有不同的解釋,比如VC和BC/CB會對同一代碼會有不同的編譯結果,造成代碼的運行結果也不一樣,這是我們應該盡量避免的。所以我們建議在代碼盡量不要依賴于前置和后置運算的區別。(盡管它會讓你的代碼看上去很象“高手”所寫)。</P>
<P> </P>
<H3><A name=7.2>7.2</A> 算術類型轉換</H3>
<H4><A name=7.2.1>7.2.1</A> 隱式類型轉換</H4>
<P>類型轉換在C,C++中也屬于一種運算。</P>
<P>前面我們舉過一個例子:</P>
<P>float a = 5 / 2 ;</P>
<P>還記得a的計算結果嗎?上式中,a將得到的值是2。因為在除式 5/2
中,5和2都是整數,所以計算機按整數類型進行了除運算,結果所有的小數位都被丟失了。</P>
<P>我們列出了三種可以解決小數位丟失的方法:</P>
<P>方法1: float a = 5.0 / 2;</P>
<P>方法2: float a = 5 / 2.0;</P>
<P>方法3: float a = 5.0 / 2.0;</P>
<P> </P>
<P>最后一種方法好理解,5.0和2.0都明確指定為實型(double),所以計算結果可以保存小數位。而像第一種:被除數5.0被指定的為實型,但除數2仍然為整型,這兩種數據類型的精度不一樣,這時,計算機將按哪個類型作為標準呢?</P>
<P> </P>
<P><B>C++遇到兩種不同數據類型的數值進行運算時,會將某個數做適當的類型轉換,然后再進行轉換。轉換總是朝表達能力列強的方向進行,并且轉換總是逐個運算符進行的。</B></P>
<P> </P>
<P>以下是轉換的兩條方向線:</P>
<P>char/unsigned char --> short/unsigned short --> int/unsigned int
--> double --> long double</P>
<P>
float --> double -->
long double</P>
<P> </P>
<P>像上面的 a = 5 / 2。計算機先計算5/2,由于
5,2一樣是整型,所以計算機不作轉換,算出其結果為2,然后賦值給a,因此,就算a是float類型,但仍然只能得到2的結果,而不是2.5。</P>
<P>而 a = 5.0 / 2。計算機在計算 5.0 / 2
時,發現5.0是實型(帶小數點),而2是整型,二者不一,所以將2先自動轉換成double數,然后現和5.0進行除運算。</P>
<P>這個轉換過程,在程序運行時自動進行,稱為隱式轉換。</P>
<P>隱式(自動)轉換盡量使用我們的程序更加合理,但有時它并不能完全符合我們的要求。比如:</P>
<P> </P>
<P>int b = 5, c = 2;</P>
<P>float a = b / c;</P>
<P> </P>
<P>由于除號兩邊的操作數:b、c都是有明確類型的變量。這時,既不會有隱式轉換進行,我們也不能通過加 '.0'來改變其中某個數的數據類型:</P>
<P>float a = b.0 / c.0; //這種寫法是錯誤的,不可能實現。</P>
<P>這種情況下,我們需要顯式(強制)類型轉換。</P>
<H4><A name=7.2.2>7.2.2</A> 顯式類型轉換</H4>
<P>顯式類型轉換也稱為強制類型轉換。它的語法形式有兩種:</P>
<P>形式1 : (類型名) 變量或數值</P>
<P>形式2: 類型名(變量或數值)</P>
<P> </P>
<P>實際例子如:</P>
<P>int b = 5, c = 2;</P>
<P>float a = (float)b / c;</P>
<P>或者:</P>
<P>float a = float(b) / c;</P>
<P>兩種寫法都可以將變量b強制轉換為float類型。</P>
<P>不過,在要轉換的數據類型帶有修飾符時,則必須使用第一種型式。比如:(unsigned int) a;</P>
<P>其實,兩邊都加上括號有時更清晰:(unsigned int) (a);</P>
<P> </P>
<H4><A name=7.3>7.3</A> 關系運算</H4>
<P> “關系”運算?聽上去很費解。</P>
<P>計算機系一師哥師妹正在處朋友,某晚兩人在校園林蔭處正在談情說愛,突然冒出一校監:“說!你倆什么關系?”</P>
<P>果然不愧為計算機系的一對小情侶,以下是他們的回答:</P>
<P>男:“我比她高!”</P>
<P>女:“我比他瘦。”</P>
<P>男:“我比她壯!”</P>
<P>女:“我比他美。”</P>
<P>校監:“我倒!”</P>
<P> </P>
<P>所謂的關系運算,在C,C++語言里,就是比較運算。</P>
<P>算術運算所得的結果是數值,而<B>關系運算所得的結果為邏輯值,也稱布爾值</B>。即我們以前所學的bool類型允許的值:真或假。真用true表示,假用false表示。</P>
<P>關系操作符有:</P>
<P>== (比較左右值是否相等)</P>
<P>> (比較左值是否大于右值)</P>
<P>>= (比較左值是否大于或等于右值,也稱為不小于)</P>
<P>< (比較左值是否小于右值)</P>
<P><=(比較左值是否小于或等于右值,也稱為不大于)</P>
<P>!= (比較左右值是否不相等)</P>
<P> </P>
<P>比較是否相等,使用兩個連寫的等號表示。因此 == 和 = 是兩個不同的概念,后者指賦值運算。</P>
<P>C,C++的不等于用 != 表示,而不是我們更常見的 <>,請大家注意。</P>
<P>下面舉一些例子。</P>
<P> </P>
<P>int a = 10;</P>
<P>int b = 9;</P>
<P>則:</P>
<P>a == b+1 運算結果: true;</P>
<P>a == b 運算結果: false;</P>
<P>a > b 運算結果: true</P>
<P>a >= b 運算結果: true;</P>
<P>b > a 運算結果: false;</P>
<P>a >= b+1 運算結果: true;</P>
<P>a <= b+1 運算結果: true;</P>
<P>a != b; 運算結果:true;</P>
<P> </P>
<H4><A name=7.4>7.4</A> 邏輯運算</H4>
<P> </P>
<P>邏輯運算有三個操作符:</P>
<P>! (非,取邏輯反,NOT)</P>
<P>&& (邏輯與,并且,AND)</P>
<P>|| (邏輯或,或者,OR)</P>
<P> </P>
<P>該到考驗你是否有資質學習編程的時候了……請回答以下三個問題:</P>
<P> </P>
<P>1、真 并且 真,結果是真是假?</P>
<P>2、真 并且 假,結果是真是假?</P>
<P>3、真 或者 假,結果是真是假?</P>
<P> </P>
<P>三道題的答案分別是:真,假,真。</P>
<P>&& 對應于題目的的“并且”,而 || 對應 “或者”</P>
<P>當我們需要說,只有條件A和條件B都成立……用C,C++表達即是: A && B。</P>
<P>當我們需要說,只要條件A或者條件中成立……,這時表達為: A || B。</P>
<P> </P>
<P>如果你是一個女學員,追求者太多讓你煩,那么你就可以開出如下條件:</P>
<P> </P>
<P>告示:</P>
<P>凡追我者,請先看以下程序代碼(如看懂,請先點擊此處到‘<A
href="http://www.bcbschool.com/">沒有彎路,編程搖籃</A>’報名進修),判斷自已是否符合條件,條件符合者,方可得以見本小姐一面:</P>
<P>a = 富和蓋茨有一比;</P>
<P>b = 帥勝德華留三分;</P>
<P>見面條件: a && b;</P>
<P></P>
<P>和比爾蓋茨一樣富<B>并且</B>和劉德華一樣帥,這樣的人有嗎?不管你嫁得出去退不出去,現在你必須牢牢記住:</P>
<P>表達式:條件1 &&
條件2,其運算結果要為真(true),必須條件1和條件2都為真。換言之,二者中有一個為假,那么整體條件就為假。</P>
<P> </P>
<P>那么,如果換成或者呢?我們來看看:</P>
<P>a = 富和蓋茨有一比;</P>
<P>b = 帥勝德華留三分;</P>
<P>見面條件: a || b;</P>
<P>事情發生了巨大的變化。現在,有個丑八怪,但卻和比爾蓋茨一樣富,你就得會會他老人家。另外有一窮光蛋,卻貌如潘安(假設潘安比德仔帥點),按照條件,你也得去見見。因為你列的條件是:a
或者 b,只要其一成立,總體條件即成立。</P>
<P> </P>
<P>最后我們來說說“!”。感嘆號在C,C++拿來表達“相反”或“非、不”等意思。它的運行很簡單:原來為真,加感嘆號后為假,原來為假,加感嘆號后為真。</P>
<P> </P>
<P>下表列出三種邏輯操作符的使用方法:</P>
<P> </P>
<TABLE
style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt"
cellSpacing=0 cellPadding=0 width=633 border=1>
<TBODY>
<TR>
<TD
style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 0.5pt solid; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid"
vAlign=top width=165>
<P class=MsoNormal><FONT face=宋體 size=3><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: 宋體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">符號</SPAN></FONT><SPAN
lang=EN-US><O:P> </O:P></SPAN></P></TD>
<TD
style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; mso-border-left-alt: solid windowtext .5pt"
vAlign=top width=191>
<P class=MsoNormal><FONT face=宋體 size=3><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: 宋體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">意思</SPAN></FONT><SPAN
lang=EN-US><O:P> </O:P></SPAN></P></TD>
<TD
style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; mso-border-left-alt: solid windowtext .5pt"
vAlign=top width=231>
<P class=MsoNormal><FONT face=宋體 size=3><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: 宋體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例子</SPAN></FONT><SPAN
lang=EN-US><O:P> </O:P></SPAN></P></TD></TR>
<TR>
<TD
style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 0.5pt solid; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; mso-border-top-alt: solid windowtext .5pt"
vAlign=top width=165>
<P class=MsoNormal><SPAN lang=EN-US style="FONT-SIZE: 12pt"><FONT
size=3>&&<O:P> </O:P></FONT></SPAN></P></TD>
<TD
style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt"
vAlign=top width=191>
<P class=MsoNormal><FONT face=宋體 size=3><SPAN
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -