




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- DB32/T 3134-2016瀝青路面就地?zé)嵩偕┕ぜ夹g(shù)規(guī)范
- DB32/T 1261-2020壽眉茶加工技術(shù)規(guī)程
- DB31/T 948-2015地下空間安全使用管理基本要求
- 【正版授權(quán)】 ISO/IEC 18584-1:2025 EN Information technology - Test methods for on-card biometric comparison applications - Part 1: General principles and specifications
- DB31/T 841-2014用人單位職業(yè)病危害現(xiàn)狀評(píng)價(jià)技術(shù)導(dǎo)則
- DB31/T 790-2014家用和類似用途電器安裝維修服務(wù)規(guī)范
- DB31/T 685-2019養(yǎng)老機(jī)構(gòu)設(shè)施與服務(wù)要求
- DB31/T 319-2013活禽市場(chǎng)交易規(guī)范
- DB31/T 1181-2019天然飾面石材加工單位產(chǎn)品能源消耗限額
- DB31/ 283-2015戶外廣告設(shè)施設(shè)置技術(shù)規(guī)范
- 水電站收購(gòu)分析報(bào)告
- 水泥粉助磨劑項(xiàng)目可行性研究報(bào)告發(fā)改委立項(xiàng)模板
- 濟(jì)南公共交通集團(tuán)有限公司招聘筆試題庫(kù)2025
- 工貿(mào)行業(yè)重大安全生產(chǎn)事故隱患判定標(biāo)準(zhǔn)解讀課件
- 委托裝訂合同協(xié)議
- 無(wú)氟防水劑研發(fā)及在紡織品中的實(shí)際應(yīng)用研究
- 水泥長(zhǎng)期購(gòu)銷合同范本
- 2025-2030年中國(guó)制罐行業(yè)現(xiàn)狀調(diào)研分析及發(fā)展趨勢(shì)預(yù)測(cè)報(bào)告
- 體檢醫(yī)學(xué)知識(shí)科普
- 2025年臨床帶教老師心得感想(7篇)
- 新北師版一年級(jí)數(shù)學(xué)下冊(cè)教案教學(xué)設(shè)計(jì)全冊(cè)
評(píng)論
0/150
提交評(píng)論