掌握J(rèn)AVE編程的流程控制_第1頁(yè)
掌握J(rèn)AVE編程的流程控制_第2頁(yè)
掌握J(rèn)AVE編程的流程控制_第3頁(yè)
掌握J(rèn)AVE編程的流程控制_第4頁(yè)
掌握J(rèn)AVE編程的流程控制_第5頁(yè)
已閱讀5頁(yè),還剩81頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第3章控制程序流程

“就象任何有感知的生物同樣,程序必須能操縱自己的世界,在執(zhí)行過(guò)程中作出判斷與選擇J

在Java里,我們運(yùn)用運(yùn)算符操縱對(duì)象和數(shù)據(jù),并用執(zhí)行控制語(yǔ)句作出選擇。Java是建立在

C++基礎(chǔ).上的,因此對(duì)C和C++程序員來(lái)說(shuō),對(duì)Java這方面的大多數(shù)語(yǔ)句和運(yùn)算符都應(yīng)是非

常熟悉R勺。當(dāng)然,Java也進(jìn)行了自己的某些改善與簡(jiǎn)化工作。

3.1使用Java運(yùn)算符

運(yùn)算符以一種或多種自變品為基礎(chǔ),可生成一種新值。白變量采用與原始措施調(diào)用不一樣日勺

一種形式,但效果是相似內(nèi)。根據(jù)此前寫(xiě)程序口勺經(jīng)驗(yàn),運(yùn)算符的常規(guī)概念應(yīng)當(dāng)不難理解。

加號(hào)(+)、減號(hào)和負(fù)號(hào)(-)、乘號(hào)(*)、除號(hào)(/)以及等號(hào)(=)日勺使用方法與其他所有編

程語(yǔ)言都是類似日勺。

所有運(yùn)算符都能根據(jù)自己內(nèi)運(yùn)算對(duì).象生成一種值。除此以外,一種運(yùn)算符可變化運(yùn)算對(duì)象日勺

值,這叫作“副作用"(SideEffect)。運(yùn)算符最常見(jiàn)日勺用途就是修改自己日勺運(yùn)算對(duì)象,從而

產(chǎn)生副作用。但要注意生成時(shí)值亦可由沒(méi)有副作用日勺運(yùn)算符生成。

幾乎所有運(yùn)算符都只能操作“主類型"(Primitives)。唯一的例外是“="、"=="和"!=”

它們能操作所有對(duì)象(也是對(duì)象易令人混淆日勺一-種地方)。除此以外,String類支持“+”和

3.1.1優(yōu)先級(jí)

運(yùn)算符的優(yōu)先級(jí)決定了存在多種運(yùn)算符時(shí)一種體現(xiàn)式各部分的計(jì)算次序。Java對(duì)計(jì)算次序作

出了尤其的規(guī)定。其中,最簡(jiǎn)樸的規(guī)則就是乘法和除法在加法和減法之前完畢。程序員常常

都會(huì)忘掉其他優(yōu)先級(jí)規(guī)則,因此應(yīng)當(dāng)用括號(hào)明確規(guī)定計(jì)算次序。例如:

A=X+Y-2/2+Z;

為上述體現(xiàn)式加上括號(hào)后,就有了一種不一樣的含義。

A=X+(Y-2)/(2+Z);

3.1.2賦值

賦值是用等號(hào)運(yùn)算符(二)進(jìn)行的。它的意思是“獲得右邊的值,把它復(fù)制到左邊”。右邊的

值可以是任何常數(shù)、變量或者體現(xiàn)式,只要能產(chǎn)生一種值就行。但左邊H勺值必須是一種明確

的、已命名的變量。也就是說(shuō),它必須有一種物理性的空間來(lái)保留右邊的值。舉個(gè)例子來(lái)說(shuō),

可將一種常數(shù)賦給一種變量(A=4;),但不可將任何東西賦給一種常數(shù)(例如不能4:A)。

對(duì)主數(shù)據(jù)類型H勺賦值是非常直接”勺。由于.主類型容納了實(shí)際的值,并且并非指向一種對(duì)象”勺

句柄,因此在為其賦值的時(shí)候,可未來(lái)自一種地方口勺內(nèi)容復(fù)制到另一種地方。例如,假設(shè)為

主類型使用“A二B",那么B處的內(nèi)容就復(fù)制到Ao若接著又修改了A,那么B主線不會(huì)受這種

修改的影響。作為一名程序員,這應(yīng)成為自己的常識(shí)。

但在為對(duì)象“賦值”的時(shí)候,狀況卻發(fā)生了變化。對(duì)一種對(duì)象進(jìn)行操作時(shí):我們真正操作H勺

是它的句柄。因此倘若“從一種對(duì)象到另一種對(duì)象”賦值,實(shí)際就是將句柄從一種地方復(fù)制

到另?種地方。這意味著假若為對(duì)象使用“C=D”,那么C和D最終都會(huì)指向最初只有D才指

向的那個(gè)對(duì)象。下面這個(gè)例子將向大家闡示這一點(diǎn)。

這里有某些題外話。在背面,大家在代碼示例里看到的第一種語(yǔ)句將是“package03”使用

的“package”語(yǔ)句,它代表本書(shū)第3章。本書(shū)每?章的箕一種代碼清單都會(huì)包括象這樣的J■

種“package”(封裝、打包、包裹)語(yǔ)句,它的作用是為那一章剩余的代碼建立章節(jié)編號(hào)。

在第17章,大家會(huì)看到第3章的所有代碼清單(除那些有不一樣封裝名稱的以外)都會(huì)自動(dòng)

置入一種名為c03的子目錄里:第4章的代碼置入c04:以此類推。所有這些都是通過(guò)第17

章展示的CodePackage,java程序?qū)崿F(xiàn)的;“封裝”口勺基本概念會(huì)在第5章進(jìn)行詳盡的解釋。

就目前來(lái)說(shuō),大家只需記住象"package03”這樣的形式只是用于為某一章的代碼清單建立

對(duì)應(yīng)的子目錄。

為運(yùn)行程序,必須保證在classpath里包括了我們安裝本書(shū)源碼文獻(xiàn)的根目錄(那個(gè)目錄里

包括了c02,c03c,c04等等子目錄

對(duì)于Java后續(xù)的版本(1.1.4和更高版本),假如您於Imain。用package語(yǔ)句封裝到一種文

獻(xiàn)里,那么必須在程序名前面指定完整的包裹名稱,否則不能運(yùn)行程序。在這種狀況下,命

令行是:

javac03.Assignment

運(yùn)行位于一種“包裹”里囪程序時(shí),隨時(shí)都要注意這方面的問(wèn)題。

下面是例子:

//:Assignment,java

//Assignmentwithobjectsisabittricky

packagec03;

classNumber{

inti;

)

publicclassAssignment(

publicstaticvoidm£in(String[]args){

Numbernl=newNumber();

Numbern2=newNumber();

nl.i=9;

n2.i=47;

System,out.printin(^1:nl.i:"+nl.i+

”,n2.i:+n2.i);

nl=n2;

System,out.printinC2:nl.i:〃+nl.i+

”,n2.i:+n2.i);

nl.i=27;

System.out.printin(^3:nl.i:"+nl.i+

〃,n2.i:"+n2.i);

)

}〃/廣

Number類非常簡(jiǎn)樸,它的兩個(gè)實(shí)例(nl和n2)是在main。里創(chuàng)立日勺。每個(gè)Number中歐Ji

值都賦予了一種不一樣的值。隨即,將n2賦給nl,并且nl發(fā)生變化。在許多程序設(shè)計(jì)語(yǔ)言

中,我們都但愿nl和n2任何時(shí)候都互相獨(dú)立。但由于我們已賦予了一種句柄,所如下面才

是真實(shí)的輸出:

1:nl.i:9,n2.i:47

2:nl.i:47,n2.i:47

3:nl.i:27,n2.i:27

看來(lái)變化nl的同步也變化了n2!這是由于無(wú)論nl還是n2都包括了相似口勺句柄,它指向相

似的對(duì)象(最初的句柄位字nl內(nèi)部,指向容納了值9的一種對(duì)象。在賦值過(guò)程中,那個(gè)句柄

實(shí)際已經(jīng)丟失;它的對(duì)象會(huì)由“垃圾搜集器”自動(dòng)清除)。

這種特殊的現(xiàn)象一般也叫作“別名”,是Java操作對(duì)象的一種基本方式。但假若不樂(lè)意在這

種狀況下出現(xiàn)別名,又該怎么操作呢?可放棄賦值,并寫(xiě)入下述代碼:

nl.i=n2.i;

這樣便可保留兩個(gè)獨(dú)立的對(duì)象,而不是將nl和r)2綁定到相似的對(duì)象。但您很快就會(huì)意識(shí)到,

這樣做會(huì)使對(duì)象內(nèi)部的字段處剪發(fā)生混亂,并與原則的面向?qū)ο笤O(shè)計(jì)?準(zhǔn)則相悖。由于這并非

一種簡(jiǎn)樸的話題,因此留待第12章詳細(xì)論述,那一章是專門討論別名的。其時(shí),大家也會(huì)注

意到對(duì)象"勺賦值會(huì)產(chǎn)生某些令人震驚的效果。

1.措施調(diào)用中的別名處理

將一種對(duì)象傳遞到措施內(nèi)部時(shí),也會(huì)產(chǎn)生別名現(xiàn)象。

//:PassObject.java

//Passingobjectstomethodscanbeabittricky

classLetter{

charc;

)

publicclassPassObject(

staticvoidf(Lettery){

y.c='z';

)

publicstaticvoidmein(String[]args){

Letterx=newLetter();

x.c='a';

System.out.printlnf^l:x.c:+x.c);

f(x);

System,out.printinC2:x.c:+x.c);

)

}〃/廣

在許多程序設(shè)計(jì)語(yǔ)言中,f()措施表面上似乎要在措施H勺作用域內(nèi)制作自己H勺自變量Lottery

時(shí)一種副本。但同樣地,實(shí)際傳遞的是一種句柄。所如F面這個(gè)程序行:

y.c='z';

實(shí)際變化的I是f()之外的對(duì)象。輸出成果如下:

1:x.c:a

2:x.c:z

別名和它的對(duì)策是非常復(fù)雜的一種問(wèn)題。盡管必須等至第12章才可獲得所有答案,但從目前

開(kāi)始就應(yīng)加以重視,以便提早發(fā)現(xiàn)它的缺陷。

3.1.3算術(shù)運(yùn)算符

Java的基本算術(shù)運(yùn)算符與其他大多數(shù)程序設(shè)計(jì)語(yǔ)言是相似的。其中包括加號(hào)(+)、減號(hào)(-)、

除號(hào)(/)、乘號(hào)(*)以及模數(shù)(%,從整數(shù)除法中獲得余數(shù))。整數(shù)除法會(huì)直接砍掉小數(shù),而

不是進(jìn)位。

Java也用一種簡(jiǎn)寫(xiě)形式進(jìn)行運(yùn)算,并同步進(jìn)行賦值操作。這是由等號(hào)前的一種運(yùn)算符標(biāo)識(shí)的J,

并且對(duì)于語(yǔ)言中的所有運(yùn)算符都是固定依J。例如,為了將4加到變量x,并將成果賦給x,可

用:x+=4o

下面這個(gè)例子展示了算術(shù)運(yùn)算符H勺多種使用方法:

//:MathOps.java

//Demonstratesthemathematicaloperators

importjava,util.*;

publicclassMathOps{

//Createashorthandtosavetyping:

staticvoidprt(Strings){

System,out.println(s);

)

//shorthandtoprintastringandanint:

staticvoidpint(Strings,inti){

prt(s+“="+i);

)

//shorthandtoprintastringandafloat:

staticvoidpFlt(Strings,floatf){

prt(s+〃="+f);

)

publicstaticvoidmsin(String[]args){

//Createarandomnumbergenerator,

//seedswithcurrenttimebydefault:

Randomrand=newFandom();

inti,j,k;

//,%'limitsmaximumvalueto99:

j=rand.nextlnt()%100;

k=rand.nextlnt0%100;

j);k);

i=j+k;pint("j+k”,i);

i=j-k;pint(“j-k〃,i);

i=k/j;plnl("k/j〃,i);

i=k*j;plntCk*j”,i);

i=k%j;pint("k%j",i);

j%=k;plnt(〃j%=k”,j);

//Floating-pointnumbertests:

floatu,v,w;//appliestodoubles,too

v=rand.nextFloat();

w=rand.nextFloat();

pFltCV,v);pFltCV;w);

u=v+w;pFlt("v+w”,u);

u=v-w;pFlt(“v-w〃,u);

u=v*w;pFlt("v*w",u);

u=v/w;pFlt(〃v/w〃,u);

//thefollowingalsoworksfor

//char,byte,short,int,long,

//anddouble:

u+=v;pFltC*u+=v”,u);

u-=v;pFltCu-=v〃,u);

u*=v;pFltC/u*=v〃,u);

u/=v;pFlt("u/=v",u);

)

)〃/廣

我們注意到日勺第?件事情就是用于打?。@示)的某些快捷措施:prt()措施打印?種String;

plntO先打印一種String.再打印一種int;而pFlt()先打印一種String,再打印一種float。

當(dāng)然,它們最終都要用System,out.printin0結(jié)尾。

為生成數(shù)字,程序首先會(huì)創(chuàng)立?種Random(隨機(jī))對(duì)象。由于自變量是在創(chuàng)立過(guò)程中傳遞時(shí),

因此Java將目前時(shí)間作為一種“種子值”,由隨機(jī)數(shù)生成器運(yùn)用。通過(guò)Random對(duì)象,程序可

生成許多不一樣類型的隨機(jī)數(shù)字。做法很簡(jiǎn)樸,只需調(diào)用不一樣的措施即可:nextIntO,

nextLongO,nextFloat()或者nextDoubleOo

若隨同隨機(jī)數(shù)生成器的成果使用,模數(shù)運(yùn)算符讖)可將成果限制到運(yùn)算對(duì)象減1U勺上限(本

例是99)之下。

1.一元加、減運(yùn)算符

一元減號(hào)(-)和一元加號(hào)(+)與二元加號(hào)和減號(hào)都是相似的運(yùn)算符。根據(jù)體現(xiàn)式的書(shū)寫(xiě)形

式,編譯器會(huì)自動(dòng)判斷使用哪一種。例如下述語(yǔ)句:

x=-a;

它的含義是顯然日勺。編譯器能對(duì)日勺識(shí)別下述語(yǔ)句:

x=a*-b;

但讀者會(huì)被搞糊涂,因此最佳更明確地寫(xiě)成:

x=a*(-b);

一元減號(hào)得到日勺運(yùn)算對(duì)象內(nèi)負(fù)值。一元加號(hào)的含義與一元減號(hào)相反,雖然它實(shí)際并不做任何

事情。

3.1.4自動(dòng)遞增和遞減

和C類似,Java提供了豐富日勺快捷運(yùn)算方式。這些快捷運(yùn)算可使代碼更清爽,更易錄入,也

更易讀者辨讀。

兩種很不錯(cuò)的快捷運(yùn)算方式是遞增和遞減運(yùn)算符(常稱作“自動(dòng)遞增”和“自動(dòng)遞減”運(yùn)算

符)。其中,遞減運(yùn)算符是“一”,意為“減少一種單位”;遞增運(yùn)算符是“++”,意為“增長(zhǎng)

一種單位”。舉個(gè)例子來(lái)說(shuō),假設(shè)A是一種int(整數(shù))值,則體現(xiàn)式++A就等價(jià)于(A=A+

Do遞增和遞減運(yùn)算符成果生成U勺是變量的值。

對(duì)每種類型口勺運(yùn)算符,均有兩個(gè)版本可供選用;一般將其稱為“前綴版”和“后綴版“前

遞增”表達(dá)++運(yùn)算符位于變量或體現(xiàn)式的前面;而“后遞增”表達(dá)++運(yùn)算符位于變量或體現(xiàn)

式的背面。類似地,“前遞減”怠味著一運(yùn)算符位于變量或體現(xiàn)式H勺前面:而“后遞減”意味

著一運(yùn)算符位于變量或體現(xiàn)式的背面。對(duì)于前遞增和前遞減(如++A或一A),會(huì)先執(zhí)行運(yùn)算,

再生成值。而對(duì)于后遞增和后遞減(如A++或A--),會(huì)先生成值,再執(zhí)行運(yùn)算。下面是一種

例子:

//:Autolnc.java

//Demonstratesthe++and-operators

publicclassAutolnc{

publicstaticvoidmain(String[Jargs){

inti=1;

prt(*i:"+i);

prt("++i:〃+++i);//Pre-increment

prl(〃i++:"+i++);//Post-increment

prt('i:〃+i);

prt(*-i:"+-i);//Pre-decrement

prt("i-:"+i-);//Post-decrement

prt("i:"+i);

staticvoidprt(Strings){

System.out.println(s);

}///:''

該程序的輸出如下:

i:1

++i:2

i++:2

i:3

—i:2

i—:2

i:1

從中可以看到,對(duì)于前綴形式,我們?cè)趫?zhí)行完運(yùn)算后才得到值。但對(duì)于后綴形式,則是在運(yùn)

算執(zhí)行之前就得到值。它們是唯一具有“副作用”的運(yùn)算符(除那些波及賦值的以外)。也就

是說(shuō),它們會(huì)變化運(yùn)算對(duì)象,而不僅僅是使用自己日勺值。

遞增運(yùn)算符正是對(duì)“C++”這個(gè)名字的一種解釋,暗示著“超載C日勺一步”。在初期附一次Java

演講中,BillJoy(始創(chuàng)人之一)聲稱“Java=C++—“(C加加減減),意味著Java已清除了

C++某些沒(méi)來(lái)由折磨人日勺地方,形成?種更精簡(jiǎn)的語(yǔ)言。正如大家會(huì)在這本書(shū)中學(xué)到的那樣,

Java的許多地方都得到了簡(jiǎn)化,因此Java的學(xué)習(xí)比C++更輕易。

3.1.5關(guān)系運(yùn)算符

關(guān)系運(yùn)算符生成口勺是一種“布爾”(Boolean)成果。它們?cè)u(píng)價(jià)的是運(yùn)算對(duì)象值之間的關(guān)系。

若關(guān)系是真實(shí)日勺,關(guān)系體現(xiàn)式會(huì)生成true(真);若關(guān)系不真實(shí),則生成false(假)。關(guān)系

運(yùn)算符包括不不小于(<)、不小于(>)、不不小于或等于(<=)、不小于或等于(>=)、等于

(==)以及不等于(!=)。等于和不等于合用于所有內(nèi)建口勺數(shù)據(jù)類型,但其他比較不合用于

boolean類型。

1.檢查對(duì)象與否相等

關(guān)系運(yùn)算符「和!二也合川于所有對(duì)象,但它們的含義一般會(huì)使初涉Java領(lǐng)域的人找不到北。

下面是一種例子:

//:Equiva1ence.java

publicclassEquivalence{

publicstaticvoidm&in(String[]args){

Integernl=newInteger(47);

Integern2=newInteger(47);

System.out.printin(nl==n2);

System.out.println(nl!=n2);

)

}〃/廣

其中,體現(xiàn)式System.out.println(nl==n2)可打印出內(nèi)部的|布爾比較成果。一般人都會(huì)認(rèn)

為輸出成果肯定先是true,再是false,由于兩個(gè)Integer對(duì)象都是相似口勺。但盡管對(duì)象的

內(nèi)容相似,句柄卻是不一樣的,而==和!=比較的恰好就是對(duì)象句柄。因此輸出成果實(shí)際上先

是false,再是true。這自然會(huì)使第一次接觸的人感到驚奇。

若想對(duì)比兩個(gè)對(duì)象的實(shí)際內(nèi)容與否相似,又該怎樣操作呢?此時(shí),必須使用所有對(duì)象給合用

的特殊措施equals。。但這個(gè)措施不合用于“主類型”,那些類型直接使用==和!=即可。下

面舉例闡明怎樣使用:

//:EqualsMethod.java

publicclassEqualsMethod{

publicstaticvoidmain(String[]args){

Integernl=newIr.teger(47);

Integern2=newIr.teger(47);

System,out.println(nl.equals(n2));

)

)///:

正如我們估計(jì)日勺那樣,此時(shí)得到的成果是true。但事情并未到此結(jié)束!假設(shè)您創(chuàng)立了自己日勺

類,就象下面這樣:

//:EqualsMethod2.jciv<i

classValue(

inti;

}

publicclassEqualsMetlud2{

publicstaticvoidmain(String[Jargs){

Valuevl=newValue();

Valuev2=newValceO;

vi.i=v2.i=10();

System,out.println(vl.equals(v2));

)

}〃/廣

此時(shí)的成果又變回了false!這是由于equals??谏啄J(rèn)行為是比較句柄。因此除非在自己口勺

新類中變化了equals。,否則不也許體現(xiàn)出我們但愿的行為。不幸的是,要到第7章才會(huì)學(xué)

習(xí)怎樣變化行為。但要注意equals。的這種行為方式同步或許可以防止某些“劫難”性的事

件。

大多數(shù)Java類庫(kù)都實(shí)現(xiàn)了equals。,因此它實(shí)際比較的是對(duì)象的內(nèi)容,而非它們的句柄。

3.1.6邏輯運(yùn)算符

邏輯運(yùn)算符AND(&&)、OR(||)以及N()T(!)能生成一種布爾值(true或false)一一以自

變量用J邏輯關(guān)系為基礎(chǔ)。下面這個(gè)例子向大家展示了怎樣使用關(guān)系和邏輯運(yùn)算符。

//:Bool,java

//Relationalandlogicaloperators

importjava,util.*;

publicclassBool{

publicstaticvoidmain(String[Jargs){

Randomrand=newRandom();

inti=rand.nextlr.t()%100;

intj=rand,nextIr.t()%100;

prtCi="+i);

prtfj=〃+j);

prt("i>jis”+(i>j));

prt(*i<jis*+(i<j));

prt("i〉=jis"+(i>=j));

prtCi<=jis'+(i<=j));

prtCi==jis'+(i==j));

prtCi!=jis'+(i!=j));

//Treatinganintasabooleanis

//notlegalJava

//!&&jis"+(i&&j));

//!prt("i||jis"+(i||j));

//!prt("!iis"+!i);

prt(i<10)&&(j<10)is”

+((i<10)&&(j<10)));

prt("(i<10)||(j<10)is”

+((i<10)||(j<10)));

)

staticvoidprt(Strings)(

System,out.println(s);

)

)〃/廣

只可將AND,OR或NOT應(yīng)用于布爾值。與在C及C++中不一樣,不可將一種非布爾值當(dāng)作布

爾值在邏輯體現(xiàn)式中使用。若這樣做,就會(huì)發(fā)現(xiàn)嘗試失敗,并用一種“〃!”標(biāo)出。然而,后

續(xù)的體現(xiàn)式運(yùn)用關(guān)系比較生成布爾值,然后對(duì)成果進(jìn)行邏輯運(yùn)算。

輸出列表看起來(lái)象下面這個(gè)樣子:

i=85

j=4

i>jistrue

i<jisfalse

i>=jistrue

i<=jisfalse

i==jisfalse

i!=jistrue

(i<10)&&(j<10)isfalse

(i<10)||(j<10)istrue

注意若在估計(jì)為String值日勺地方使用,布爾值會(huì)自動(dòng)轉(zhuǎn)換成合適日勺文本形式。

在上述程序中,可將對(duì)int的定義替代成除boolean以外口勺其他任何主數(shù)據(jù)類型。但要注意,

對(duì)浮點(diǎn)數(shù)字H勺比較是非常嚴(yán)格H勺。雖然一種數(shù)字僅在小數(shù)部分與另一種數(shù)字存在極微小日勺差

異,仍然認(rèn)為它們是“不相等”口勺。雖然一種數(shù)字只比零大一點(diǎn)點(diǎn)(例如2不停地開(kāi)平方根),

它仍然屬于“非零”值。

1.短路

操作邏輯運(yùn)算符時(shí),我們會(huì)碰到一種名為“短路”口勺狀況。這意味著只有明確得出整個(gè)體現(xiàn)

式真或假口勺結(jié)論,才會(huì)對(duì)體現(xiàn)式進(jìn)行邏輯求值。因此,一種邏輯體現(xiàn)式FI勺所有部分均有也許

不進(jìn)行求值:

//:ShortCircuit.java

//Demonstratesshort-circuitingbehavior

//withlogicaloperators.

publicclassShortCirctit{

staticbooleantest1tintval)

System,out.printIn("test1(“+val+")〃);

System.out.printin(/'result:+(val<1));

returnval<1;

)

staticbooleantest2(intval)

System.out.printin(,ztest2(,zval+”)〃);

System.out.printIn(/'result:+(val<2));

returnval<2;

)

staticbooleantest3(intval)

System,out.printin("test3(“val+")〃);

System.out.printin(''result:+(val<3));

returnval<3;

)

publicstaticvoidm&in(String[]args){

if(testl(0)&&test2(2)&&test3(2))

System.out.printin(''expressionistrue");

else

System,out.printin("'expressionisfalse");

)

}〃/廣

每次測(cè)試都會(huì)比較自變量,并返回真或假。它不會(huì)顯示與準(zhǔn)備調(diào)用什么有關(guān)的資料。測(cè)試在

下面這個(gè)體現(xiàn)式中進(jìn)行:

if(testl(0))&&test2(2)&&test3(2))

很自然地,你也許認(rèn)為所有這三個(gè)測(cè)試都會(huì)得以執(zhí)行。但但愿輸出成果不至于使你大吃一驚:

if(test1(0)&&test2(2)&&test3(2))

第一種測(cè)試生成一種true成果,因此體現(xiàn)式求值會(huì)繼續(xù)下去。然而,第二個(gè)測(cè)試產(chǎn)生了一種

「alse成果。由于這意味著整個(gè)體現(xiàn)式肯定為「alse,所認(rèn)為何還要繼續(xù)剩余R勺體現(xiàn)式呢?這

樣做只會(huì)徒勞無(wú)益。實(shí)際上,“短路”一詞的由來(lái)正種因于此。假如一種邏輯體現(xiàn)式的所有部

分都不必執(zhí)行下去,那么潛在H勺性能提高將是相稱可觀時(shí)。

3.1.7按位運(yùn)算符

按位運(yùn)完符容許我們操作一種整數(shù)主數(shù)據(jù)類型中口勺單個(gè)“比特”,即二進(jìn)制位。按位運(yùn)算符會(huì)

對(duì)兩個(gè)自變量中對(duì)應(yīng)的位執(zhí)行布爾代數(shù),并最終身成一種成果。

按位運(yùn)算來(lái)源于C語(yǔ)言的低級(jí)操作。我們常常都要直接操縱硬件,需要頻繁設(shè)置硬件寄存器

內(nèi)的二進(jìn)制位。JavaIJ勺設(shè)計(jì)初衷是嵌入電視頂置盒內(nèi),因此這種低級(jí)操作仍被保留下來(lái)了。

然而,由于操作系統(tǒng)的進(jìn)步,目前也許不必過(guò)于頻繁地進(jìn)行按位運(yùn)算。

若兩個(gè)輸入位都是1,則按位AND運(yùn)算符(&)在輸出位里生成一種1;否則生成0。若兩個(gè)

輸入位里至少有一種是1,則按位OR運(yùn)算符(I)在輸出位里生成一種1;只有在兩個(gè)輸入位

都是0日勺狀況下,它才會(huì)生成一種0。若兩個(gè)輸入位的某一種是1,但不全都是1,那么按位

XOR(\異或)在輸M位里生成一種1。按位NOT(?,乜叫作“非”運(yùn)算符)屬于一元運(yùn)算

符;它只對(duì)?種自變量進(jìn)行操作(其他所有運(yùn)算符都是二元運(yùn)算符)。按位NOT生成與輸入位

的相反的值一一若輸入0,則輸出1;輸入1,則輸出0。

按位運(yùn)算符和邏輯運(yùn)算符都使用了同樣的字符,只是數(shù)量不一樣。因此,我們能以便地記憶

各自的含義:由于“位”是非?!靶 钡?,因此按位運(yùn)算符僅使用了一種字符。

按位運(yùn)算符可與等號(hào)(:)聯(lián)合使用,以便合并運(yùn)算及賦值:&二,I=和三都是合法的(由于~

是一元運(yùn)算符,因此不可與二聯(lián)合使用)。

我們將boolean(布爾)類型當(dāng)作一種“單位”或“單比特”值看待,因此它多少有些獨(dú)特

的地方。我們可執(zhí)行按位AND,OR和XOR,但不能執(zhí)行按位NOT(大概是為了防止與邏輯NOT

混淆)。對(duì)于布爾值,按位運(yùn)算符具有與邏輯運(yùn)算符相似的效果,只是它們不會(huì)中途“短路”。

此外,針對(duì)布爾值進(jìn)行的按位運(yùn)算為我們新增了一種XOR邏輯運(yùn)算符,它并未包括在“邏輯”

運(yùn)算符的列表中。在移位體現(xiàn)式中,我們被嚴(yán)禁使用布公運(yùn)算,原因?qū)⒃谙旅娼忉尅?/p>

3.1.8移位運(yùn)算符

移位運(yùn)笄符面向的運(yùn)算對(duì)象也是一進(jìn)制於廣位工可單獨(dú)用它們處理整數(shù)類型(主類型的一種)。

左移位運(yùn)算符(?)能將運(yùn)算符左邊的運(yùn)算對(duì)象向左移動(dòng)運(yùn)算符右側(cè)指定的I位數(shù)(在低位補(bǔ)

0)。“有符號(hào)”右移位運(yùn)算符(?)則將運(yùn)算符左邊日勺運(yùn)算對(duì)象向右移動(dòng)運(yùn)算符右側(cè)指定H勺位

數(shù)。“有符號(hào)”右移位運(yùn)算符使用了“符號(hào)擴(kuò)展”:若值為正,則在高位插入0;若值為負(fù),

則在高位插入1。Java也添加了一種“無(wú)符號(hào)”右移位運(yùn)算符(?>),它使用了“零擴(kuò)展”:

無(wú)論正負(fù),都在高位插入0。這i運(yùn)算符是C或C++沒(méi)有的。

若對(duì)char,byte或者short進(jìn)行移位處理,那么在移位進(jìn)行之前,它們會(huì)自動(dòng)轉(zhuǎn)換成?種

into只有右側(cè)的5個(gè)低位才會(huì)用到。這樣可防止我們?cè)谝环Nint數(shù)里移動(dòng)不切實(shí)際的位數(shù)。

若對(duì)一種long值進(jìn)行處理,最終得到的成果也是long。此時(shí)只會(huì)用到右側(cè)的6個(gè)低位,防

止移動(dòng)超過(guò)long值里現(xiàn)成的位數(shù)。但在進(jìn)行“無(wú)符號(hào)”右移位時(shí),也也許碰到?種問(wèn)題。若

對(duì)byte或short值進(jìn)行右移位運(yùn)算,得到的也許不是對(duì)的U勺成果(Java1.0和Java1.1尤

其突出)。它們會(huì)自動(dòng)轉(zhuǎn)換成int類型,并進(jìn)行右移位。但“零擴(kuò)展”不會(huì)發(fā)生,因此在那些

狀況下會(huì)得到T的成果??捎孟旅孢@個(gè)例子檢測(cè)自己的實(shí)現(xiàn)方案:

//:CRShift.java

//Testofunsignedrightshift

publicclassURShift{

publicstaticvoidmain(String[]args){

inti=-1;

i?>=10;

System.out.println(i);

long1=-1;

1?>=10;

System.out.println(l);

shorts=-1;

s?>=10;

System.out.printin(s);

byteb=-1;

b?>=10;

System.out.println(b);

)

}〃/廣

移位可與等號(hào)(<<=或>=或>>>=)組合使用。此時(shí),運(yùn)算符左邊的值會(huì)移動(dòng)由右邊的值指定

的位數(shù),再將得到的成果賦回左邊日勺值。

下面這個(gè)例子向大家闡示了怎樣應(yīng)用波及“按位”操作時(shí)所有運(yùn)算符,以及它們的效果:

//:BitManipulation.java

//Usingthebitwiseoperators

importjava.util.*;

publicclassBitManipulation{

publicstaticvoidmain(String[]args){

Randomrand=newRandom();

inti=rand,nextlr.t();

intj=rand,nextIr.t();

pBinlnt("T",-1);

pBinlnt('+1”,+1);

intmaxpos=;

pBinlnt("maxpos”,maxpos);

intmaxneg=一;

pBinlnt("maxneg”,maxneg);

pBinlnt("i",i);

pBinlnt~i);

pBinlnt("-i”,-i);

pBinlnt(^j^,j);

pBinlnt("i&j",i&j);

pBinlnt("i|j",i|j);

pBinlnt("i'j",i"j);

pBinlntCi?5〃,i?5);

pBinlnt(〃i?5”,i?5);

pBinlnt(*Ci)?5",Ci)?5);

pBinlnt(〃i?>5”,i?>5);

pBinlntCCi)?>5",Ci)?>5);

long1=rand.nextLongO;

longm=rand.nextLongO;

pBinLong("TL",-IL);

pBinLong("+lL",+1L);

long11=4775807L;

pBinLong(^maxpos^,11);

longlln=-4775808L;

pBinLong("maxneg”,lln);

pBinLong("l",1);

pBinLong'D;

pBinLong(*-K,-1);

pBinLong("m",m);

pBinLong(“1&m〃,1&m);

pBinLong(*lm",1m);

pBinLong(“1m",1m);

pBinLong(“1?5”,1?5);

pBinLong(“1?5”,1?5);

pBinLongC*Cl)?5".(~1)?5);

pBinLong^l?>5〃,1?>5);

pBinLong("(~l)?>5",(~1)>?5);

)

staticvoidpBinlnt(Strings,inti){

System,out.printin(

s+,int:+”,binary:〃);

System.out.print("");

for(intj=31;j>=0;j—)

if(((l?j)&i)!=0)

System,out.print(T);

else

System.out.print("0");

System.out.println();

)

staticvoidpBinLong(Strings,long1){

System,out.println(

s+”,long:binary:");

System,out.print("");

for(inti=63;i>=0;i—)

if(((lL?i)&1)!=0)

System.out.print(T):

else

System,out.prirt(〃0");

System,out.println();

)

}〃/廣

程序末尾調(diào)用了兩個(gè)措施:pBinlntO和pBinLongO。它們分別操作一種int和long值,并

用一種二進(jìn)制格式輸出,同步附有簡(jiǎn)要的闡明文字。目前,可臨時(shí)忽視它們?cè)敿?xì)日勺實(shí)現(xiàn)方案。

大家要注意口勺是System.out.print。的使用,而不是System.out.printlnO。print。措施

不會(huì)產(chǎn)生?種新行,以便在同?行里羅列多種信息。

除展示所有按位運(yùn)算符針對(duì)int和longH勺效果之外,本例也展示了int和long的最小值、

最大值、+1和T值,使大家能體會(huì)它們的狀況。注意高位代表正負(fù)號(hào):0為正,1為負(fù)。下

面列出int部分的輸出:

-1,int:-1,binary:

11111111

+1,int:1,binary:

00000001

maxpos,int:,binary:

11111111

maxneg,int:binary:

00000000

i,int:59081716,binary:

11110100

~i,int:-59081717,binary:

00001011

-i,int:-59081716,binary:

00001100

j,int:,binary:

10001100

i&j,int:58720644,binary:

10000100

iIj,int:,binary:

11111100

i八j,int:,binary:

01111000

i<<5,int:,binary:

10000000

i?5,int:1846303,binary:

00011111

Ci)?5,int:-1846304,binary:

11100000

i?>5,int:1846303,binary:

00011111

Ci)?>5,int:,binary:

11100000

數(shù)字的二進(jìn)制形式體現(xiàn)為“有符號(hào)2的補(bǔ)值”。

3.1.9三元if-else運(yùn)算符

這種運(yùn)算符比較罕見(jiàn),由于它有三個(gè)運(yùn)算對(duì)象。但它確實(shí)屬于運(yùn)算符FI勺一種,由于它最終也

會(huì)生成一種值。這與本章后一節(jié)要講述的一般if-else語(yǔ)句是不一樣H勺。體現(xiàn)式采用下述形

式:

布爾體現(xiàn)式?值0:值1

若“布爾體現(xiàn)式”的成果為true,就計(jì)算“值()”,并且它的成果成為最終由運(yùn)算符產(chǎn)生的值。

但若“布爾體現(xiàn)式”的成果為false,計(jì)算的J就是“值1”,并且它的成果成為最終由運(yùn)算符

產(chǎn)生的值。

當(dāng)然,也可以換用一般的「『else語(yǔ)句(在背面簡(jiǎn)介),但三元運(yùn)算符愈加簡(jiǎn)潔。盡管C引認(rèn)

為傲的就是它是一種簡(jiǎn)潔內(nèi)語(yǔ)言,并且三元運(yùn)算符的引入多半就是為了體現(xiàn)這種高效率日勺編

程,但假若您打算頻繁用它,還是要先多作某些思量一一它很輕易就會(huì)產(chǎn)生可讀性極差啊代

碼。

可將條件運(yùn)算符用于自己向“副作用”,或用于它生成的值。但一般都應(yīng)將其用于值,由于那

樣做可將運(yùn)算符與if-clse明確區(qū)別開(kāi)。下面便是一種例子:

staticintternary(inti){

returni<10?i*100:i*10;

)

可以看出,假設(shè)用一般的if-else構(gòu)造寫(xiě)上述代碼,代碼量會(huì)比上面多出許多。如下所示:

staticintalternative(inti){

if(i<10)

returni*100;

returni*10;

}

但第二種形式更易理解,并且不規(guī)定更多的錄入。因此在挑選三元運(yùn)算符時(shí),請(qǐng)務(wù)必權(quán)衡?

F利弊。

3.1.10逗號(hào)運(yùn)算符

在C和C++里,逗號(hào)不僅作為函數(shù)自變量列表的分隔符使用,也作為進(jìn)行后續(xù)計(jì)算的一種運(yùn)

算符使用。在Java里需要用到逗號(hào)的唯一場(chǎng)所就是for循環(huán),本章稍后會(huì)對(duì)此詳加解釋。

3.1.11字串運(yùn)算符+

這個(gè)運(yùn)算符在Java里有一項(xiàng)特殊用途:連接不一樣的字串。這一點(diǎn)已在前面的例子中展示過(guò)

了。盡管與十的老式息義不符,但用+來(lái)做這件事情仍然是非常自然的。在C++里,這一功能

看起來(lái)非常不錯(cuò),因此引入了一項(xiàng)“運(yùn)算符過(guò)載”機(jī)制,以便C++程序員為幾乎所有運(yùn)算符

增長(zhǎng)特殊的含義。但非常不幸,與C++的此外某些限制結(jié)合,運(yùn)算符過(guò)載成為一種非常復(fù)雜

的特性,程序員在設(shè)計(jì)自己的類時(shí)必須對(duì)此有周到的考慮。與C++相比,盡管運(yùn)算符過(guò)載在

Java里更易實(shí)現(xiàn),但迄今為止仍然認(rèn)為這一特性過(guò)于復(fù)雜。因此Java程序員不能象C++程序

員那樣設(shè)計(jì)自己的過(guò)載運(yùn)算符。

我們注意到運(yùn)用“Siring”時(shí)某些有趣的現(xiàn)象。若體現(xiàn)式以一種Siring起頭,那么后續(xù)所

有運(yùn)算對(duì)象都必須是字串。如下所示:

intx=0,y=1,z=2;

StringsString="x,y,z

System.out.printin(sString+x+y+z);

在這里,Java編譯程序會(huì)將x,y和z轉(zhuǎn)換成它們口勺字串形式,而不是先把它們加到一起。

然而,假如使用下述語(yǔ)句:

System.out.println(x+sString);

那么初期版本"勺Java就會(huì)提醒出錯(cuò)(后來(lái)U勺版本能將x轉(zhuǎn)換成一種字串)。因此,假如想通

過(guò)“加號(hào)”連接字串(使用Java的初期版本),請(qǐng)務(wù)必保證第一種元素是字用(或加上引號(hào)

的一系列字符,編譯能將其識(shí)別成一種字串)。

3.1.12運(yùn)算符常規(guī)操作規(guī)則

使用運(yùn)算符口勺一種缺陷是括號(hào)口勺運(yùn)用常常輕易搞錯(cuò)。雖然對(duì)一種體現(xiàn)式怎樣計(jì)算有絲亳不確

定的原因,都輕易混淆括號(hào)H勺使用方法。這個(gè)問(wèn)題在Java里仍然存在。

在C和C++中,一種尤其常見(jiàn)的錯(cuò)誤如下:

while(x=y){

//...

程序的意圖是測(cè)試與否“相等"(==),而不是進(jìn)行賦值操作。在C和C++中,若y是-一種非

零值,那么這種賦值的成果肯定是true。這樣使也許得到一種無(wú)限循環(huán)。在Java里,這個(gè)

體現(xiàn)式口勺成果并不是布爾值,而編譯器期望的是一種布爾值,并且不會(huì)從一種int數(shù)值中轉(zhuǎn)

換得來(lái)。因此在編譯時(shí),系統(tǒng)就會(huì)提醒出現(xiàn)錯(cuò)誤,有效地制止我們深入運(yùn)行程序。因此這個(gè)

缺陷在Java里永遠(yuǎn)不會(huì)導(dǎo)致更嚴(yán)重B勺后果。唯?不會(huì)得到編譯錯(cuò)誤H勺時(shí)候是x和y都為布爾

值。在這種狀況下,x=y屬于合法體現(xiàn)式。而在上述狀況下,則也許是一種錯(cuò)誤。

在C和C++里,類似的一種問(wèn)題是使用按位AND和OR,而不是邏輯AND和OR。按位AND和OR

使用兩個(gè)字符之一(&或I〕,而邏輯AND和OR使用兩個(gè)相似的字符(&&或||)。就象“二”和

“==”同樣,鍵入一種字符當(dāng)然要比鍵入兩個(gè)簡(jiǎn)樸。在Java里,編譯器同樣可■防止這一點(diǎn),

由于它不容許我們強(qiáng)行使用一種并不屬于的類型。

3.1.13造型運(yùn)算符

“造型"(Cast)H勺作用是“與一種模型匹配二在合適的時(shí)候,Java會(huì)將一種數(shù)據(jù)類型自動(dòng)

轉(zhuǎn)換成另一種。例如,假?zèng)]我們?yōu)楦↑c(diǎn)變量分派一種整數(shù)值,計(jì)算機(jī)會(huì)將int自動(dòng)轉(zhuǎn)換成

floato通過(guò)造型,我們可明確設(shè)置這種類型的轉(zhuǎn)換,或者在一般沒(méi)有也許進(jìn)行的時(shí)候強(qiáng)迫它

進(jìn)行。

為進(jìn)行一次造型,要將括號(hào)中但愿的數(shù)據(jù)類型(包括所有修改符)置于其他任何值的左側(cè)。

下面是一種例子:

voidcasts(){

inti=200;

long1=(long)i;

long12=(long)200;

)

正如您看到日勺那樣,既可對(duì)一種數(shù)值進(jìn)行造型處理,亦可對(duì)一種變量進(jìn)行造型處理。但在這

兒展示日勺兩種狀況卜,造駕均是多出口勺,由于編譯器在必要口勺時(shí)候會(huì)自動(dòng)進(jìn)行int值到long

值的轉(zhuǎn)換。當(dāng)然,仍然可以設(shè)置一種造型,提醒自己留心,也使程序更清晰。在其他狀況下,

造型只有在代碼編譯時(shí)才顯出重要性。

在C和C++中,造型有時(shí)會(huì)讓人頭痛。在Java里,造型則是一種比較安全的J操作。不過(guò),若

進(jìn)行?種名為“縮小轉(zhuǎn)換"(NarrowingConversion)日勺操作(也就是說(shuō),腳本是能容納更多

信息的數(shù)據(jù)類型,將其轉(zhuǎn)換成容量較小的類型),此時(shí)就也許面臨信息丟失的危險(xiǎn)。此時(shí),編

譯器會(huì)強(qiáng)迫我們進(jìn)行造型,就好象說(shuō):“這也許是一件危險(xiǎn)的事情一一假如您想讓我不顧一切

地做,那么對(duì)不起,請(qǐng)明確造型?!倍鴮?duì)于“放大轉(zhuǎn)換”(Wideningconversion),則不必進(jìn)

行明確造型,由于新類型肯定能容納本來(lái)類型日勺信息,不會(huì)導(dǎo)致任何信息的J丟失。

Java容許我們將任何主類型“造型”為其他任何一種主類型,但布爾值(bollean)要除外,

后者主線不容許進(jìn)行任何造型處理。“類”不容許進(jìn)行造型。為了將一種類轉(zhuǎn)換成另一種,必

須采用特殊的措施(字串是一種特殊的狀況,本書(shū)背面會(huì)講到將對(duì)象造型到一種類型“家族”

里;例如,“橡樹(shù)”可造型為“樹(shù)”;反之亦然。但對(duì)于具他外來(lái)類型,如,'巖石",則不能造

型為“樹(shù)”)。

1.字面值

最開(kāi)始的I時(shí)候,若在一種程序里插入“字面值"(Literal),編譯器一般能精確懂得要生成什

么樣的類型。但在有些時(shí)侯,對(duì)于類型卻是曖昧不清日勺。若發(fā)生這種狀況,必須對(duì)編譯器加

以合適日勺“指導(dǎo)”。措施是用與字面值關(guān)聯(lián)的字符形式加入某些額外的信息。下面這段代碼向

大家展示了這些字符。

//:Literals,java

classLiterals

charc=Oxffff;//maxcharhexvalue

byteb=0x7f;//maxbytehexvalue

shorts=0x7fff;//maxshorthexvalue

inti1=0x2f;//Hexadecimal(lowercase)

inti2=0X2F;//Hexadecimal(uppercase)

inti3=0177;//Octal(leadingzero)

//HexandOctalsoworkwithlong.

longnl=200L;//longsuffix

longn2=2001;//longsuffix

longn3=200;

//!long16(200);//notallowed

floatf1=1;

floatf2=IF;//floatsuffix

floatf3=If;//floatsuffix

floatf4=le-45f;//10tothepower

floatf5=le+9f;//floatsuffix

doubledl=Id;//doublesuffix

doubled2=ID;//doublesuffix

doubled3=47e47d;//10tothepower

}〃/廣

十六進(jìn)制(Base16)一一它合用于所有整數(shù)數(shù)據(jù)類型一一用一種前置的Ox或0X指示。并在

背面跟隨采用大寫(xiě)或小寫(xiě)形式的0-9以及a-f。若試圖將一種變量初始化成超過(guò)自身能力日勺

一種值(無(wú)論這個(gè)值的數(shù)值形式怎樣),編譯器就會(huì)向我們匯報(bào)一條出錯(cuò)消息。注意在上述代

碼中,最大日勺十六進(jìn)制值只會(huì)在char,byte以及short身上出現(xiàn)。若超過(guò)這,限制,編譯器

會(huì)將值自動(dòng)變成一種int,并告訴我們需要對(duì)這一次賦值進(jìn)行?“縮小造型”。這樣一來(lái),我們

就可清晰獲知自己已超載了邊界。

八進(jìn)制(Base8)是用數(shù)字中的一種前置0以及0-7日勺數(shù)位指示的。在C,C++或者Java中,

對(duì)二進(jìn)制數(shù)字沒(méi)有對(duì)應(yīng)的“字面”表達(dá)措施。

字面值后的尾隨字符標(biāo)志著它的類型。若為大寫(xiě)或小寫(xiě)的L,代表long:大寫(xiě)或小寫(xiě)的F,

代表float;大寫(xiě)或小寫(xiě)的D,則代表double。

指數(shù)總是采用一種我們認(rèn)為很不直觀的記號(hào)措施:1.39e-47f。在科學(xué)與工程學(xué)領(lǐng)域,“e”代

衣自然對(duì)數(shù)的基數(shù),約等于2.718(Java一種更精確的dwble值采用Math.EH勺形式)。它在

象”1.39XeU勺-47次方”這樣的指數(shù)體現(xiàn)式中使用,意味著“1.39X2.718的-47次方”。然

而,自FORTRAN語(yǔ)言發(fā)明后,人們自然而然地覺(jué)得e代表“10多少次呆”。這種做法顯得頗

為古怪,由于FORTRAN最初面向U勺是科學(xué)與工程設(shè)計(jì)領(lǐng)域。理所當(dāng)然,它的設(shè)計(jì)者應(yīng)對(duì)這樣

的混淆概念持謹(jǐn)慎態(tài)度(注釋①)。但不管怎樣,這種尤其"勺體現(xiàn)措施在C,C++以及目前"勺

Java中頑固地保留下來(lái)了。因此倘若您習(xí)慣將e作為自然對(duì)數(shù)的基數(shù)使用,那么在Java中

看到象“1.39e-47r'這樣的體現(xiàn)式時(shí),請(qǐng)轉(zhuǎn)換您的思維,從程序設(shè)計(jì)的角度思索它;它真正

的含義是“1.39X10的-47次方二

①:JohnKirkham這樣寫(xiě)道:“我最早于1962年在一部IBM1620機(jī)器上使用FORTRANII。

那時(shí)一一包括60年代以及70年代的初期,F(xiàn)ORTRAN一直都是使用大寫(xiě)字母。之因此會(huì)出現(xiàn)

這一狀況,也許是由于初期口勺輸入設(shè)備大多是老式電傳打字機(jī),使用5位Baudot碼,那種碼

并不具有小寫(xiě)能力。乘幕體現(xiàn)式中的'E,也肯定是大寫(xiě)的,因此不會(huì)與自然對(duì)數(shù)日勺基數(shù)‘?!?/p>

發(fā)生沖突,后者必然是小寫(xiě)的?!瓻'這個(gè)字母的含義其實(shí)很簡(jiǎn)樸,就是'Exponential'的)意

思,即'指數(shù)'或‘第數(shù)',代表計(jì)算系統(tǒng)日勺基數(shù)-----般都是10。當(dāng)時(shí),八進(jìn)制也在程序

員中廣泛使用。盡管我自己未看到它H勺使用,但假若我在乘鞋體現(xiàn)式中看到一種八進(jìn)制數(shù)字,

就會(huì)把它認(rèn)作Base8。我記得第一次看到用小寫(xiě)'e'表達(dá)指數(shù)是在70年代末期。我當(dāng)時(shí)也

覺(jué)得它極易產(chǎn)生混淆。因比說(shuō),這個(gè)問(wèn)題完全是自己‘潛入'FORTRAN里去時(shí),并非一開(kāi)始

就有。假如你真的想使用自然對(duì)數(shù)的基數(shù),實(shí)際有現(xiàn)成日勺函數(shù)可供運(yùn)用,但它們都是大寫(xiě)日勺?!?/p>

注意假如編譯器可以對(duì)的地識(shí)別類型,就不必使用尾隨字符。對(duì)于下述語(yǔ)句:

longn3=200;

它并不存在含混不清的地方,因此200背面的一種L大可省去。然而,對(duì)于下述語(yǔ)句:

floatf4=le-47f;〃1。即J哥數(shù)

編譯器一般會(huì)將指數(shù)作為雙精度數(shù)(double)處理,因此假如沒(méi)有這個(gè)尾隨『、Jf,就會(huì)收到

一條出錯(cuò)提醒,告訴我們須用一種“造型”將double轉(zhuǎn)換成float。

2.轉(zhuǎn)型

大家會(huì)發(fā)現(xiàn)假若對(duì)主數(shù)據(jù)類型執(zhí)行任何算術(shù)或按位運(yùn)算,只要它們“比int小”(即char,

byle或者shorl),那么在正式執(zhí)行運(yùn)算之前,那些值會(huì)自動(dòng)轉(zhuǎn)換成ini。這樣一來(lái),最終身

成的值就是ini類型。因此只要把一種值賦回較小的類型,就必須使用“造型工此外,由于

是將值賦回給較小的類型,因此也許出現(xiàn)信息丟失口勺狀況)。一般,體現(xiàn)式中最大的數(shù)據(jù)類型

是決定了體現(xiàn)式最終止果大小口勺那個(gè)類型。若將一種float值與一種double值相乘,成果就

是double;如將一種int和一種long值相加,則成果為long。

3.1.14Java沒(méi)有“sizeof”

在C和C++中,sizeofO運(yùn)算符能滿足我們的一項(xiàng)特殊需要:獲知為數(shù)據(jù)項(xiàng)目分派的字符數(shù)

量。在C和C++中,sizeC最常見(jiàn)R勺一種應(yīng)用就是“移植”。不一

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論