




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第3章Java基本程序設(shè)計3.1變量與數(shù)據(jù)類型
3.2運算符、表達(dá)式與語句
3.3循環(huán)與選擇性語句
3.1變量與數(shù)據(jù)類型
3.1.1變量與常量
下面來看一個簡單的實例,以便于讀者了解Java中變量與常量之間的關(guān)系。下面的程序中聲明了兩種Java經(jīng)常使用到的變量—整型變量num與字符變量ch,為它們賦值后,再把它們的值分別顯示在顯示器上。
【例3-1】TestJava3_1.java。在TestJava3_1中,聲明了兩種不同類型的變量num與ch,并分別將常量3與字符“z”賦值給這兩個變量,最后再將它們顯示在顯示器上。
聲明一個變量時,編譯程序會在內(nèi)存里開辟一塊足以容納此變量的內(nèi)存空間。不管變量的值如何改變,都永遠(yuǎn)使用相同的內(nèi)存空間。因此,善用變量是一種節(jié)省內(nèi)存的方式。
常量是不同于變量的一種類型,它的值是固定的,如整數(shù)常量、字符串常量。通常給變量賦值時,會將常量賦值給它。在程序TestJava3_1中,第6行num是整型變量,而3則是常量。此行的作用是聲明num為整型變量,并把常量3這個值賦給它。第7行聲明了一個字符變量ch,并將字符常量'z'賦給它。當(dāng)然,在程序進行過程中,可以為變量重新賦值,也可以使用已經(jīng)聲明過的變量。3.1.2Java的變量類型
在Java中規(guī)定了八種變量類型來存儲整數(shù)、浮點數(shù)、字符和布爾值,如圖3-1所示。圖3-1Java的變量類型3.1.3基本數(shù)據(jù)類型
到目前為止,相信讀者已經(jīng)對Java有了一些初步的認(rèn)識,如果想在程序中使用一個變量,就必須先聲明,此時編譯程序會在未使用的內(nèi)存空間中尋找一塊足夠保存這個變量的空間以供這個變量使用。Java的基本數(shù)據(jù)類型如表3-1所示。表3-1Java的基本數(shù)據(jù)類型
1.整數(shù)類型
當(dāng)數(shù)據(jù)不帶有小數(shù)或分?jǐn)?shù)時,可以聲明為整數(shù)變量,如3、-147等為整數(shù)。Java中,整型數(shù)據(jù)類型可以分為long、int、short和byte四種。long為64位,也就是8個字節(jié),可表示范圍為?-9?223?372?036?854?775?808~9?223?372?036?854?775?807;int為32位,也就是4個字節(jié),表示范圍為?-2?147?483?648~2?147?483?647;若數(shù)據(jù)值的范圍為?-32?768~32?767,可以聲明為short(短整數(shù))類型;若數(shù)據(jù)值更小,在?-128到127之間,可以聲明為byte類型以節(jié)省內(nèi)存空間。
1)常量的數(shù)據(jù)類型
Java把整數(shù)常量的數(shù)據(jù)類型均視為int型,因此,如果在程序中使用了超過2?147?483?647這個大小的常量,編譯時將發(fā)生錯誤。
【例3-2】TestJava3_2.java。
2)數(shù)據(jù)類型的最大值與最小值
Java提供了long、int、short及byte四種整數(shù)類型的最大值、最小值代碼,以方便設(shè)計者使用,最大值的代碼是MAX_VALUE,最小值是MIN_VALUE。如果要取用某個類型的最大值或最小值,只要在這些代碼之前加上它們所屬的類的全名即可。例如,如果程序代碼里需要用到長整數(shù)的最大值,則可用如圖3-2所示的語法表示。圖3-2代碼的表示法由上面的語法可知,如果要使用某個類型的代碼,則必須先指定該類型所在的類庫以及該類型所屬的類,但因java.lang這個類庫屬于常用類庫,所以默認(rèn)的Java程序會將它加載,因此在實際的應(yīng)用中設(shè)計者可以將它省略。
Java所提供的整數(shù)的最大值與最小值的標(biāo)識符及常量值可在表3-2中查閱。表3-2整數(shù)常量的特殊值代碼
3)溢出的發(fā)生
當(dāng)整數(shù)的數(shù)據(jù)大小超出了可以表示的范圍,而程序中又沒有進行數(shù)值范圍的檢查時,這個整型變量所輸出的值將發(fā)生紊亂,且不是預(yù)期的運行結(jié)果。在下面的例子中,聲明了一個整型的數(shù),并把它賦值為整型可以表示的范圍的最大值,然后將它分別加1和加2。
【例3-4】TestJava3_4.java。當(dāng)最大值加上1時,結(jié)果反而變成表示范圍中最小的值,當(dāng)最大值加上2時,結(jié)果變成表示范圍中次小的值,這就是數(shù)據(jù)類型的溢出。讀者可以發(fā)現(xiàn),這個情形會出現(xiàn)一個循環(huán),若要避免這種情況的發(fā)生,就必須在程序中加上數(shù)值范圍的檢查功能,或者使用較大的表示范圍的數(shù)據(jù)類型,如長整型。例如,聲明了一個整數(shù)i,其表示范圍為-2?147?483?648~2?147?483?647,當(dāng)i的值設(shè)為最大值2?147?483?647時,它仍在整數(shù)的范圍內(nèi),但是當(dāng)x加1和加2時,整數(shù)x的值反而變成?-2?147?483?648和-2?147?483?647,成為可表示范圍的最小值及次小值。上述情形就像計數(shù)器的內(nèi)容到最大值時會自動歸零一樣。在整數(shù)中,最小值為-2?147?483?648,所以當(dāng)整數(shù)x的值最大時,加上1就會變成最小值-2?147?483?648,也就是產(chǎn)生了溢出??梢詤⒖紙D3-3來了解數(shù)據(jù)類型的溢出問題。圖3-3數(shù)據(jù)類型的溢出為了避免int類型的溢出,可以在該表達(dá)式中任一常量后加上大寫的“L”,或是在變量前面加上long,作為強制類型的轉(zhuǎn)換。例如,在下面的程序中加上了防止溢出的處理。為了讓讀者方便比較,特地保留了一個整數(shù)的溢出語句。
【例3-5】TestJava3_5.java。程序說明:
(1)第6行聲明int類型的整數(shù)變量x,并賦值為整數(shù)最大值,即2?147?483?647。
(2)第7行輸出x的值,即2?147?483?647。
(3)第8行輸出x?+?1的值,此時溢出發(fā)生,運行結(jié)果變成?-2?147?483?648。
(4)第9行輸出x?+?2的值,為了避免溢出發(fā)生,在表達(dá)式的常量部分2后加上L,執(zhí)行結(jié)果變成2?147?483?649。
(5)第10行輸出x?+?3的值,為了避免溢出發(fā)生,在表達(dá)式的整數(shù)部分x之前加上long,執(zhí)行結(jié)果變成2?147?483?650。
2.字符類型
字符類型在內(nèi)存中占有2個字節(jié),可以用來保存英文字母等字符。計算機處理字符類型時,是把這些字符當(dāng)成不同的整數(shù)來看待的,因此,嚴(yán)格來說,字符類型也算是整數(shù)類型的一種。在計算機的世界里,所有的文字、數(shù)值都只是一連串的0與1。這些0與1對于設(shè)計者來說難以理解,于是就產(chǎn)生了各種方式的編碼,它們指定一個數(shù)值來代表某個字符,如常用的字符碼系統(tǒng)ASCII。雖然各類編碼系統(tǒng)合起來有數(shù)百種之多,卻沒有一種包含足夠的字符、標(biāo)點符號及常用的專業(yè)技術(shù)符號。這些編碼系統(tǒng)之間可能還會有相互沖突的情形發(fā)生。也就是說,不同的編碼系統(tǒng)可能會使用相同的數(shù)值來表示不同的字符,在數(shù)據(jù)跨平臺的時候就會發(fā)生錯誤。
Unicode就是為了避免上述情況的發(fā)生而產(chǎn)生的,它為每個字符制訂了一個唯一的數(shù)值,因此在任何語言、平臺、程序中都可以安心使用。Java所使用的就是Unicode字符碼系統(tǒng)。
舉例來說,Unicode中的小寫a以97來表示,在下面的程序中可以看到,聲明字符類型的變量ch1、ch2分別將變量ch1的值設(shè)為97,將ch2的值設(shè)為字符a,再輸出字符變量ch1及ch2的內(nèi)容。
【例3-6】TestJava3_6.java。輸出結(jié)果:
ch1=a
ch2=a
給字符變量賦值可以使用數(shù)值和字符,它們都可以使程序正確運行。要注意的是,字符要用一對單引號(?''?)括起。
舉例來說,想在程序中輸出一個包括雙引號的字符串,可把字符變量賦值為轉(zhuǎn)義字符,再將它輸出來。也就是說,要在程序中聲明一個字符類型變量ch,可把ch設(shè)置為\",再進行輸出操作。或者也可以直接在要輸出的字符串中加入特殊的轉(zhuǎn)義字符。表3-3為常用的轉(zhuǎn)義字符。表3-3常用的轉(zhuǎn)義字符下面的例子中將ch賦值為“\"”(要以單引號(')包圍),并將字符變量ch輸出在顯示器上,同時在打印的字符串里直接加入轉(zhuǎn)義字符。讀者可自行比較一下兩種方式的差異。
【例3-7】TestJava3_7.java。輸出結(jié)果:
"測試轉(zhuǎn)義字符!"
"helloworld!"
不管是用變量存放轉(zhuǎn)義字符,還是直接使用轉(zhuǎn)義字符來輸出字符串,程序都可以順利運行。當(dāng)然也可以不聲明字符變量就輸出轉(zhuǎn)義字符,但如果在程序中加上太多轉(zhuǎn)移字符,以至于造成混淆而不易閱讀時,采用聲明字符變量的方式就是一個很好的選擇。
3.浮點數(shù)類型與雙精度浮點數(shù)類型
在日常生活中用到小數(shù)類型的數(shù)值(如身高、體重等需要精確的數(shù)值)時,整數(shù)就不能滿足程序設(shè)計者的要求了。在數(shù)學(xué)中,這些帶有小數(shù)點的數(shù)值稱為實數(shù);在Java里,這種數(shù)據(jù)類型稱為浮點數(shù)類型(float),其長度為4個字節(jié),有效范圍為-3.4E38~3.4E38。當(dāng)浮點數(shù)的表示范圍不夠大時,還有一種雙精度(double)浮點數(shù)可供使用。雙精度浮點數(shù)類型的長度為8個字節(jié),有效范圍為-1.7E308~1.7E308。浮點數(shù)的表示方式,除了指數(shù)形式外,還可用帶有小數(shù)點的一般形式。例如,要聲明一個double類型的變量num與一個float類型的變量sum,并同時給sum賦初值3.0,可以在程序中做如下聲明及設(shè)置:值得一提的是,使用浮點型數(shù)值時,默認(rèn)的類型是double,在數(shù)值后面可加上D或d作為double類型的標(biāo)識。在Java中,D或d是可有可無的。若在數(shù)值后面加上F或f,則為float類型的識別。若沒有加上F或f,Java就將該數(shù)據(jù)視為double類型,在編譯時就會發(fā)生錯誤,錯誤提示會告訴設(shè)計者可能失去精確度。例如,在下面的程序里聲明一個float類型的變量num,并賦值為3.0,將num*num的運算結(jié)構(gòu)輸出到顯示器上。
【例3-8】TestJava3_8.java。表3-4浮點數(shù)常量的特殊值
4.布爾類型
布爾(boolean)類型的變量只有true(真)和false(假)兩種。也就是說,當(dāng)將一個變量定義成布爾類型時,它的值只能是true或false,除此之外,沒有其他值可以賦值給這個變量。要想聲明status變量為布爾類型,并設(shè)置為true值,可以使用下面的語句:
booleanstatus=true; //聲明布爾變量status,并賦值為true
經(jīng)過聲明之后,布爾變量的初值為true。當(dāng)然如果在程序中需要更改status的值,可以隨時更改。
【例3-10】TestJava3_10.java。通常布爾值用來控制程序的流程,讀者可能會覺得有些抽象,本書將會陸續(xù)在后面的章節(jié)中介紹布爾值在程序流程中所起的作用。
5.基本數(shù)據(jù)類型的默認(rèn)值
在Java中,若在聲明變量時沒有給變量賦初值,則會給該變量賦默認(rèn)值。表3-5列出了各種類型的默認(rèn)值。表3-5基本數(shù)據(jù)類型的默認(rèn)值數(shù)據(jù)3.1.4數(shù)據(jù)類型的轉(zhuǎn)換
Java的數(shù)據(jù)類型在定義時就已經(jīng)確定了,因此不能隨意轉(zhuǎn)換成其他數(shù)據(jù)類型,但Java允許用戶有限度地進行類型轉(zhuǎn)換處理。數(shù)據(jù)類型的轉(zhuǎn)換方式可分為自動類型轉(zhuǎn)換及強制類型轉(zhuǎn)換兩種。
1.自動類型轉(zhuǎn)換
在程序中已經(jīng)定義好了數(shù)據(jù)類型的變量,若要用另一種數(shù)據(jù)類型表示,則Java會在下列條件皆成立時自動進行數(shù)據(jù)類型的轉(zhuǎn)換。
(1)轉(zhuǎn)換前的數(shù)據(jù)類型與轉(zhuǎn)換后的數(shù)據(jù)類型兼容。
(2)轉(zhuǎn)換后的數(shù)據(jù)類型的表示范圍比轉(zhuǎn)換前的大。值得注意的是,類型的轉(zhuǎn)換只限于該行語句,并不會影響原先所定義的變量的類型,而且通過自動類型轉(zhuǎn)換,可以保證數(shù)據(jù)的精確度,不會因為轉(zhuǎn)換而損失數(shù)據(jù)內(nèi)容。這種類型的轉(zhuǎn)換方式也稱為擴大轉(zhuǎn)換。前面曾經(jīng)提到過,若整數(shù)類型為short或byte,為了避免溢出,Java會將表達(dá)式中的short和byte類型自動轉(zhuǎn)換成int類型,這樣可保證其運算結(jié)果的正確性,這也是Java所提供的“擴大轉(zhuǎn)換”功能。字符與整數(shù)可使用自動類型轉(zhuǎn)換,整數(shù)與浮點數(shù)亦是兼容的,但是由于boolean類型只能存放true或false,與整數(shù)及字符不兼容,因此不可能進行類型轉(zhuǎn)換。下面的例子給出了當(dāng)兩個數(shù)中有一個為浮點數(shù)時其運算結(jié)果的變化。
2.強制類型轉(zhuǎn)換
當(dāng)兩個整數(shù)進行運算時,其運算結(jié)果也是整數(shù)。例如,當(dāng)做整數(shù)除法8/3的運算時,其結(jié)果為整數(shù)2,并不是實際的2.6666…,因此在Java中若要得到計算結(jié)果為浮點數(shù),就必須將數(shù)據(jù)類型做強制類型轉(zhuǎn)換。強制類型轉(zhuǎn)換的語法如下:
(欲轉(zhuǎn)換的數(shù)據(jù)類型)變量名稱;
因為這種強制類型轉(zhuǎn)換是直接編寫在程序代碼中的,所以也稱為顯性轉(zhuǎn)換。下面的程序說明了在Java中整數(shù)與浮點數(shù)是如何轉(zhuǎn)換的。
【例3-12】TestJava3_12。當(dāng)兩個整數(shù)相除時,小數(shù)點以后的數(shù)字會被截斷,使得運算結(jié)果為整數(shù)。但由于這并不是預(yù)期的計算結(jié)果,而想要得到的運算結(jié)果為浮點數(shù),因此就必須將兩個整數(shù)中的一個(或兩個)強制轉(zhuǎn)換為浮點數(shù)。下面的三種寫法都正確。
(1)?(float)a/b//:將整數(shù)a強制轉(zhuǎn)換成浮點數(shù),再與整數(shù)b相除。
(2)?a/(float)b//:將整數(shù)b強制轉(zhuǎn)換成浮點數(shù),再以整數(shù)a除之。
(3)?(float)a/(/float)b//:將整數(shù)a與b同時強制轉(zhuǎn)換成浮點數(shù),再相除。只要在變量前面加上欲轉(zhuǎn)換的數(shù)據(jù)類型,運行時就會自動將此行語句里的變量進行類型轉(zhuǎn)換處理,但這并不影響原先所定義的數(shù)據(jù)類型。此外,將一個超出該變量可表示范圍的值賦值給這個變量稱為縮小轉(zhuǎn)換。由于在轉(zhuǎn)換過程中可能會降低數(shù)據(jù)的精確度,因此Java并不會自動進行這些類型轉(zhuǎn)換,此時就必須進行強制類型轉(zhuǎn)換。案例1數(shù)據(jù)類型轉(zhuǎn)換
【案例描述】
Java語言中的數(shù)據(jù)類型有多種,不同數(shù)據(jù)類型之間可以進行轉(zhuǎn)換。
【技術(shù)要點】
不同數(shù)據(jù)類型占用的內(nèi)存空間大小不一樣,因此表示的范圍也不一樣。各種數(shù)據(jù)類型是可以相互轉(zhuǎn)換的,有些轉(zhuǎn)換是默認(rèn)的,有些轉(zhuǎn)換是強制的。如果在計算中沒有注意到這些隱式轉(zhuǎn)換,則可能損失數(shù)據(jù)的精度,影響得出正確的結(jié)果。
【代碼與注釋】
程序名稱為TypeTransform.java。圖3-4程序運行結(jié)果【程序解析】
第7行的正常運算結(jié)果是6.5,進行自動類型轉(zhuǎn)換后為6;第9行和10行強制類型轉(zhuǎn)換的結(jié)果是不一樣的。第11行進行隱式強制類型轉(zhuǎn)換。
【相關(guān)知識】
當(dāng)操作數(shù)的類型不同時,經(jīng)常需要進行強制類型轉(zhuǎn)換,將操作數(shù)轉(zhuǎn)化為所需要的類型。強制類型轉(zhuǎn)換有兩種形式:顯式強制類型轉(zhuǎn)換和隱式強制類型轉(zhuǎn)換。顯式強制類型轉(zhuǎn)換需要使用強制類型轉(zhuǎn)換運算符,格式如下:
(type)<expression>
其中,type為類型描述符,如int、float等;<expression>為表達(dá)式。經(jīng)強制類型轉(zhuǎn)換運算符運算后,返回一個具有type類型的數(shù)值。
隱式強制類型轉(zhuǎn)換發(fā)生在賦值表達(dá)式和有返回值的函數(shù)調(diào)用表達(dá)式中。在賦值表達(dá)式中,如果賦值符左右兩側(cè)的操作數(shù)類型不同,則將賦值符右邊操作數(shù)強制轉(zhuǎn)換為賦值符左側(cè)的類型后,賦值給賦值符左側(cè)的變量。
字符型數(shù)據(jù)在計算機中用ASCII碼表示。 3.2運算符、表達(dá)式與語句
3.2.1表達(dá)式與運算符
Java中的語句有很多種形式,表達(dá)式就是其中的一種。表達(dá)式由操作數(shù)與運算符組成。操作數(shù)可以是常量、變量,也可以是方法,而運算符就是數(shù)學(xué)中的運算符號,如“+”、“-”、“*”、“/”、“%”等。下面以表達(dá)式z+100為例,“z”與“100”都是操作數(shù),而“+”就是運算符,如圖3-5所示。圖3-5表達(dá)式由操作數(shù)與運算符組成
Java提供了許多運算符,這些運算符除了可以處理一般的數(shù)學(xué)運算外,還可以做邏輯運算、地址運算等。根據(jù)其所使用的類的不同,運算符可分為賦值運算符、一元運算符、算術(shù)運算符、關(guān)系運算符、遞增與遞減運算符、邏輯運算符、條件運算符、括號運算符等。
1.賦值運算符
當(dāng)為各種不同數(shù)據(jù)類型的變量賦值時,必須使用賦值運算符(=)。表3-6列出的賦值運算符雖然只有一個,但它是Java語言中必不可少的。表3-6賦?值?運?算?符等號(=)在Java中并不是“等于”的意思,而是“賦值”的意思。
例如,圖3-6所示的語句是將整數(shù)22賦值給num這個變量。又如:
num=num-3
其含義是把num-3的值運算之后再賦值給num存放,因為之前已經(jīng)把num的值設(shè)為22,所以執(zhí)行這個語句時,Java會先處理等號后面的部分num-3(值為19),再賦值給等號前面的變量num,執(zhí)行后,存放在變量num的值就變成了19。圖3-6表達(dá)式的賦值范例
2.一元運算符
對于大部分表達(dá)式而言,運算符前后都會有操作數(shù)。但是有一種運算符較特別,它只需要一個操作數(shù),稱為一元運算符。下面的語句就是由一元運算符與一個操作數(shù)所組成的。表3-7一元運算符輸出結(jié)果:
a=127,~a=–128
b=false,!b=true
程序說明:
(1)第6行聲明了byte變量a,并賦值為該類型的最大值,即a的值為127。
(2)第7行聲明了boolean變量b,賦值為false。
(3)第8行輸出a與~a的運算結(jié)果。
(4)第9行輸出b與!b的運算結(jié)果。b的值為false,因此進行“!”運算后,b的值就變成了true。
3.算術(shù)運算符
在數(shù)學(xué)中經(jīng)常會用到算術(shù)運算符。表3-8列出了算術(shù)運算符的成員。
1)加法運算符“+”
加法運算符用于將加法運算符“+”的前后兩個操作數(shù)相加。
2)減法運算符“-”
減法運算符用于將減法運算符“-”前面的操作數(shù)減去后面的操作數(shù)。
3)乘法運算符“*”
乘法運算符用于將乘法運算符“*”的前后兩個操作數(shù)相乘。
4)除法運算符“/”
除法運算符用于將除法運算符“/”前面的操作數(shù)除以后面的操作數(shù)。
5)余數(shù)運算符“%”
余數(shù)運算符用于將余數(shù)運算符“%”前面的操作數(shù)除以后面的操作數(shù),取其所得到的余數(shù)。
下面程序聲明了兩個整型變量a、b,并分別賦值為5和3,再將a%b的運算結(jié)果輸出。
【例3-16】TestJava3_16.java。
4.關(guān)系運算符與if語句
設(shè)計者常常會在if語句中用到關(guān)系運算符,所以有必要介紹if語句的用法。if語句的格式如下:
if(判斷條件)
語句;
如果括號中的判斷條件成立,則會執(zhí)行后面的語句;如果判斷條件不成立,則后面的語句不會被執(zhí)行。
當(dāng)x的值大于0,即判斷條件成立時,會執(zhí)行輸出字符串“IlikeJava!”的操作;相反,當(dāng)x的值為0或小于0時,if語句的判斷條件不成立,則不會執(zhí)行上述操作。表3-9列出了關(guān)系運算符的成員,這些運算符在數(shù)學(xué)上也是經(jīng)常使用的。在Java中,關(guān)系運算符的表示方式和在數(shù)學(xué)中很類似,但是由于賦值運算符為“=”,因此為了避免混淆,當(dāng)使用關(guān)系運算符“等于”(==)時,必須用兩個等號表示,而關(guān)系運算符“不等于”的形式有些特別,用“!=”代表,這是因為在鍵盤上取得數(shù)學(xué)上的不等于符號“≠”較為困難,所以就用“!=”表示不等于。當(dāng)使用關(guān)系運算符去判斷一個表達(dá)式成立與否時,若判斷式成立則會產(chǎn)生一個響應(yīng)值true,若判斷式不成立則會產(chǎn)生響應(yīng)值false。下面程序判斷if語句括號中的條件是否成立,若成立則執(zhí)行if后面的語句。
【例3-17】TestJava3_17.java。程序說明:
(1)在第6行中,由于5>2的條件成立,所以執(zhí)行第7行的語句,即輸出返回值true。
(2)在第8行中,若if語句的參數(shù)為true,判斷成立,所以接著執(zhí)行第9行的語句,輸出字符串HelloTestJava!。
(3)第11行中,3+6并不等于3-6,if的判斷條件不成立,所以第12行語句不被執(zhí)行。
5.遞增與遞減運算符
遞增與遞減運算符在C/C++?中就已經(jīng)存在,Java仍然將它們保留了下來,這是因為它們具有相當(dāng)大的便利性。表3-10列出了遞增與遞減運算符的成員。表3-10遞增與遞減運算符善用遞增與遞減運算符可使程序更加簡潔。例如,聲明一個int類型的變量a,在程序運行中使其加1,語句如下:
a=a+1; //?a加1后再賦值給a存放
也可以利用遞增運算符“++”寫出更簡潔的語句,而語句的意義是相同的。例如:
a++; //?a加1后再賦值給a存放,a++?為簡潔寫法
在程序中還可以看到另外一種遞增運算符“++”的用法,即遞增運算符“++”在變量的前面,如?++a,這和a++?所代表的意義是不一樣的。a++?會先執(zhí)行整個語句后再將a的值加1,而?++b則先把b的值加1后,再執(zhí)行整個語句。下面程序?qū)與b的值皆設(shè)為3,并將a++?及?++b輸出,讀者可以輕易地比較出兩者的不同。程序說明:
(1)在第8行中,輸出a++?及運算后a的值,所以執(zhí)行a++?后,a的值才會加1,變成4。
(2)在第10行中,輸出?++b運算后b的值,所以執(zhí)行?++b前,b的值先加1,變成4。
同樣地,遞減運算符“--”的使用方式和遞增運算符“++”是相同的,遞增運算符“++”用來將變量值加1,而遞減運算符“--”則用來將變量值減1。
此外,遞增與遞減運算符只能將變量加1或減1,若要將變量加或減非1的數(shù),則還得用原來“a=a+2”的方法。
6.邏輯運算符
在if語句中也經(jīng)常用到邏輯運算符。表3-11列出了邏輯運算符的成員。
當(dāng)使用邏輯運算符&&時,運算符前后的兩個操作數(shù)的返回值皆為真,運算的結(jié)果才會為真;使用邏輯運算符“||”時,運算符前后的兩個操作數(shù)的返回值只要有一個為真,運算的結(jié)果就會為真。例如:
(1)?a>0&&b>0 //兩個操作數(shù)皆為真,運算結(jié)果才為真
(2)?a>0||b> 0 //兩個操作數(shù)只要一個為真,運算結(jié)果就為真在第1個例子中,a?>?0且b?>?0時,表達(dá)式的返回值為true,即表示這兩個條件必須同時成立結(jié)果才為真;在第2個例子中,只要a?>?0或者b?>?0,表達(dá)式的返回值即為true,這兩個條件僅需要一個成立即可。讀者可以參考表3-12所列結(jié)果。由表3-12可以看出,在條件中,只要有一個條件為假(false),相與的結(jié)果就是假(false);相反地,如果有一個條件為真(true),那么相或的結(jié)果就為真(true)。下面程序判斷a的值是否在0~100之間,如果不在則表示成績輸入錯誤,如果a的值在50~60之間,則需要補考。
【例3-19】TestJava3_19.java。
程序說明:
(1)當(dāng)程序執(zhí)行到第7行時,if會根據(jù)括號中a的值作判斷,若a?<?0或a?>?100,則條件成立,執(zhí)行第8行的語句,輸出字符串“輸入的數(shù)據(jù)有錯誤!”。由于學(xué)生成績介于0~100分之間,因此當(dāng)a的值不在這個范圍時,就會視為輸入錯誤。
(2)不管第8行是否執(zhí)行,都會接著執(zhí)行第9行的程序。if再根據(jù)括號中a的值做判斷,若a?<?60且a?>?49,則條件成立,表示該成績需要進行補考,執(zhí)行第10行的語句,輸出“準(zhǔn)備補考吧!”。
7.括號運算符
除了前面所述運算符外,括號()也是Java的運算符,如表3-13所示。3.2.2運算符的優(yōu)先級
表3-14列出了各個運算符的優(yōu)先級排列,數(shù)字越小,表示優(yōu)先級越高。表3-14運算符的優(yōu)先級3.2.3表達(dá)式
表達(dá)式是由常量、變量或其他操作數(shù)與運算符組合而成的語句。例如,下面的例子均是表達(dá)式正確的使用方法。
此外,Java還有一些相當(dāng)簡潔的寫法,即將算術(shù)運算符和賦值運算符結(jié)合成為新的運算符。表3-15列出了這些運算符。表3-15簡潔的表達(dá)式程序說明:
(1)第6行分別把變量a、b賦值為5及8。
(2)第7行在運算之前先輸出變量a、b的值,a為5,b為8。
(3)第8行計算a+=b,這個語句相當(dāng)于a=a+b,將a+b的值存放到a中,即計算5+8的結(jié)果后賦值給a存放。
(4)第9行輸出運算之后變量a、b的值,所以a的值變成13,而b仍為8。
除了前面所提到的算術(shù)運算符和賦值運算符的結(jié)合可以存在于簡潔的表達(dá)式中外,遞增、遞減運算符也同樣可以應(yīng)用在簡潔的表達(dá)式中。表3-16列出了一些簡潔寫法的運算符及其范例說明。表3-16簡潔表達(dá)式的范例3.2.4表達(dá)式的類型轉(zhuǎn)換
當(dāng)int類型遇上了float類型時,到底誰是“贏家”呢?Java是一種很有彈性的程序設(shè)計語言,當(dāng)上述的情況發(fā)生時,只要堅持“以不流失數(shù)據(jù)為前提”的大原則,即可做不同的類型轉(zhuǎn)換,使不同類型的數(shù)據(jù)、表達(dá)式都能繼續(xù)存儲。依照大原則,當(dāng)Java發(fā)現(xiàn)程序的表達(dá)式中有類型不相符的情況時,會依據(jù)下列規(guī)則來處理類型的轉(zhuǎn)換。
(1)占用字節(jié)較少的類型轉(zhuǎn)換成占用字節(jié)較多的類型。
(2)字符類型會轉(zhuǎn)換成int類型。
(3)?int類型會轉(zhuǎn)換成float類型。
(4)表達(dá)式中若某個操作數(shù)的類型為double,則另一個操作數(shù)也會轉(zhuǎn)換成double類型。
(5)布爾類型不能轉(zhuǎn)換成其他類型。圖3-7數(shù)據(jù)類型的轉(zhuǎn)換過程案例2根據(jù)成績計算績點
【案例描述】
Java語言中的變量可以隨時聲明隨時使用,但在不同的位置定義的變量,它的作用范圍不同,變量的作用范圍是在一定的范圍內(nèi)有效的。本案例演示了在多個位置定義變量之間的關(guān)系。
【技術(shù)要點】
變量在一定范圍內(nèi)有效,即變量超出其作用范圍,其占用的內(nèi)存空間將會被回收。此時對其重新進行聲明是可以的。
【代碼與注釋】
程序名稱為VarScope.java?!具\行結(jié)果】
程序運行結(jié)果如圖3-8所示。
【程序解析】
第2行定義的變量w是類變量,作用域是整個類;第6行定義的變量z是局部變量,作用域只能是?{}?內(nèi)。圖3-8程序運行結(jié)果【相關(guān)知識】
局部變量是在方法內(nèi)定義的變量,也稱為自動(Automatic)變量。它的作用域為它所在方法或方法中的某塊代碼,離開該方法,局部變量將會被清除。在成員方法內(nèi)定義的變量是該成員方法的“局部”變量。如果在幾個成員方法中使用相同的變量名,則所代表的是不同的變量。在一個確定的域中,變量名應(yīng)該是唯一的。通常一個域用大括號“{”和“}”來劃定。局部變量在方法或方法的某一塊代碼中聲明。
類變量是在類中聲明的,不是在類的方法中聲明的,顯然它的作用域是整個類。
方法參數(shù)用于將數(shù)據(jù)傳遞給方法,它的作用域不能超越使用它的方法。 3.3循環(huán)與選擇性語句
3.3.1程序的結(jié)構(gòu)設(shè)計
一般來說,程序的結(jié)構(gòu)包含下面三種:
(1)順序結(jié)構(gòu);
(2)選擇結(jié)構(gòu);
(3)循環(huán)結(jié)構(gòu)。
這三種不同的結(jié)構(gòu)有一個共同點,就是它們都只有一個入口,也只有一個出口。程序中使用了上面這些結(jié)構(gòu)到底有什么好處呢?這些單一入、出口可以讓程序易讀、好維護,也可以減少調(diào)試的時間。下面以流程圖的方式來介紹這三種結(jié)構(gòu)的不同。
1.順序結(jié)構(gòu)
本書前面例子采用的都是順序結(jié)構(gòu),程序由上而下逐行執(zhí)行,一條語句執(zhí)行完之后繼續(xù)執(zhí)行下一條語句,一直到程序的末尾。這種結(jié)構(gòu)如圖3-9所示。圖3-9順序結(jié)構(gòu)的基本流程
2.選擇結(jié)構(gòu)
選擇結(jié)構(gòu)根據(jù)條件的成立與否再決定要執(zhí)行哪些語句的結(jié)構(gòu),其流程圖如圖3-10所示。
這種結(jié)構(gòu)可以依據(jù)判斷條件的結(jié)構(gòu)來決定要執(zhí)行的語句。當(dāng)判斷條件的值為真時,就運行“語句1”;當(dāng)判斷條件的值為假時,執(zhí)行“語句2”。不論執(zhí)行哪一個語句,最后都會再回到“語句3”繼續(xù)執(zhí)行。例如,下面程序聲明了兩個整數(shù)a及b,并賦初值,如果a大于b,則在顯示器中輸出a-b的計算結(jié)果。無論a是否大于b,最后均輸出a*b的值。圖3-10選擇結(jié)構(gòu)的基本流程
3.循環(huán)結(jié)構(gòu)
循環(huán)結(jié)構(gòu)根據(jù)判斷條件的成立與否,決定程序段落的執(zhí)行次數(shù),而這個程序段落就稱為循環(huán)主體。循環(huán)結(jié)構(gòu)的流程圖如圖3-11所示。圖3-11循環(huán)結(jié)構(gòu)的基本流程3.3.2選擇結(jié)構(gòu)
1.?if語句
在前面簡單地介紹了if的用法。要根據(jù)判斷的結(jié)構(gòu)來執(zhí)行不同的語句時,使用if語句就是一個很好的選擇,它會準(zhǔn)確地檢測判斷條件成立與否,再決定是否要執(zhí)行后面的語句。
if語句的格式如下:若if語句主體中要處理的語句只有1個,可省略左、右大括號。當(dāng)判斷條件的值不為假時,就會逐一執(zhí)行大括號里面所包含的語句。if語句的流程圖如圖3-12所示。圖3-12if語句的流程圖
2.?if…else語句
當(dāng)程序中存在含有分支的判斷語句時,就可以用if...else語句處理。當(dāng)判斷條件成立時,執(zhí)行if語句主體;當(dāng)判斷條件不成立時,則會執(zhí)行else后面的語句主體。if…else語句的格式如下:若在if語句主體或else語句主體中要處理的語句只有一個,則可以將左、右大括號去除。if…else語句的流程圖如圖3-13所示。圖3-13if...else語句的基本流程下面例子聲明一個整型變量a,并給其賦初值5,在程序中判斷a是奇數(shù)還是偶數(shù),再將判斷的結(jié)果輸出。
【例3-24】TestJava3_24.java。程序說明:
(1)第6~9行為if...else語句。在第6行中,if的判斷條件為a%2==1,若a除以2取余數(shù)得到的結(jié)果為1,則表示a為奇數(shù),若a除以2取余數(shù)得到的結(jié)果為0,則a為偶數(shù)。
(2)當(dāng)a除以2取余數(shù)的結(jié)果為1時,執(zhí)行第7行語句,輸出“a為奇數(shù)!”;否則執(zhí)行第9行語句,輸出“a為偶數(shù)!”。
讀者可以自行更改變量a的初值,再重復(fù)執(zhí)行程序。
從上面的程序中可以發(fā)現(xiàn),程序的縮進在這種選擇結(jié)構(gòu)中起著非常重要的作用,它可以使設(shè)計者編寫的程序結(jié)構(gòu)層次清晰,在維護上也比較簡單。所以本書建議讀者以后在編寫程序時要養(yǎng)成縮進的好習(xí)慣。
3.條件運算符
條件運算符可以代替if…else語句,如表3-17所示。表3-17條件運算符輸出結(jié)果:
a=5,b=13
最大的數(shù)是:13
程序說明:
(1)第6行聲明變量并為其賦初值。a、b為要比較大小的兩個整數(shù)值;max存放比較大小后最大的那個值。
(2)第7行賦值,當(dāng)a?>?b時,max=a,否則max=b。
(3)第8行輸出a、b的值。
(4)第9行輸出最大值。
可以自行更改a、b的值,再運行此程序。讀者可以發(fā)現(xiàn),使用條件運算符編寫程序時較為簡潔,它用一個語句就可以替代一長串的if...else語句,所以條件運算符的執(zhí)行速度也較快。
4.?if...elseif...else語句
如果需要在if...else中判斷多個條件,則需要if...elseif...else語句,其格式如下:
3.3.3多重選擇語句—switch語句
switch語句可以將多選一的情況簡化,使程序簡潔易懂。本節(jié)將介紹如何使用switch語句和break語句;此外,還要討論在switch語句中如果不使用break語句會出現(xiàn)的問題。
要在許多選擇條件中找到并執(zhí)行其中一個符合判斷條件的語句時,除了可以使用if...else不斷地判斷之外,還可以使用另一種更方便的方式,即多重選擇—switch語句。使用嵌套if...else語句最常發(fā)生的狀況就是容易將if與else配對混淆而造成閱讀及運行上的錯誤。使用switch語句可以避免這種錯誤的發(fā)生。要特別注意的是,在switch語句里的選擇值只能是字符或常量。switch語句的執(zhí)行流程如下:
(1)計算括號中表達(dá)式的結(jié)果。
(2)根據(jù)表達(dá)式的值檢測是否符合執(zhí)行case后面的選擇值,若所有case的選擇值皆不符合,則執(zhí)行default所包含的語句,執(zhí)行完畢后離開switch語句。
(3)如果某個case的選擇值符合表達(dá)式的結(jié)果,則執(zhí)行該case所包含的語句,一直遇到break語句后離開switch語句。
(4)若沒有在case語句結(jié)尾處加上break語句,則會一直執(zhí)行到switch語句的尾端才離開switch語句。
(5)若沒有定義default該執(zhí)行的語句,則什么也不會執(zhí)行,直接離開switch語句。
根據(jù)上面的描述,可以繪制出如圖3-14所示的switch語句流程圖。圖3-14switch語句的基本流程程序說明:
(1)第7行利用變量存放一個運算符號,如3+2、5*7等。
(2)第8~25行為switch語句。當(dāng)oper為字符?+、-、*、/?時,輸出運算的結(jié)果后離開switch語句。若所輸入的運算符皆不在這些范圍內(nèi),則執(zhí)行default所包含的語句,輸出“未知的操作!”,再離開switch。
(3)選擇值為字符時,必須用單引號將字符包圍起來。
程序運行結(jié)果會因為沒有加上break語句而出現(xiàn)錯誤,所以程序設(shè)計者在使用switch語句時要特別注意是否需要加上break語句。3.3.4while循環(huán)
while是循環(huán)語句,也是條件判斷語句。當(dāng)事先不知道循環(huán)該執(zhí)行多少次時,就要用到while循環(huán)。
while循環(huán)的格式如下:當(dāng)while循環(huán)主體有且只有一個語句時,可以將大括號除去。在while循環(huán)語句中,只有一個判斷條件,它可以是任何表達(dá)式。當(dāng)判斷條件的值為真時,循環(huán)執(zhí)行一次,再重復(fù)測試判斷條件,執(zhí)行循環(huán)主體,直到判斷條件的值為假,跳離while循環(huán)。
下面列出了while循環(huán)執(zhí)行的流程。
(1)第一次進入while循環(huán)前,就必須先為循環(huán)控制變量(或表達(dá)式)賦起始值。
(2)根據(jù)判斷條件的內(nèi)容決定是否要繼續(xù)執(zhí)行循環(huán)。如果條件判斷值為真(true),則繼續(xù)執(zhí)行循環(huán)主體;如果條件判斷值為假(false),則跳出循環(huán)執(zhí)行其他語句。
(3)執(zhí)行完循環(huán)主體內(nèi)的語句后,重新為循環(huán)控制變量(或表達(dá)式)賦值(增加或減少)。由于while循環(huán)不會自動更改循環(huán)控制變量(或表達(dá)式)的內(nèi)容,所以在while循環(huán)中為循環(huán)控制變量賦值的工作要由設(shè)計者自己來做。完成后回到第(2)步重新判斷是否繼續(xù)執(zhí)行循環(huán)。
根據(jù)上述程序流程可以繪制出如圖3-15所示的while循環(huán)流程圖。圖3-15while循環(huán)的基本流程程序說明:
(1)在第6行中,將循環(huán)控制變量i的值賦值為1。
(2)第7行進入while循環(huán)的判斷條件為i<=10,第一次進入循環(huán)時,由于i的值為1,所以判斷條件的值為真,即進入循環(huán)主體。
(3)第8~11行為循環(huán)主體,sum+i后指定給sum存放,i的值加1,回到循環(huán)起始處,繼續(xù)判斷i的值是否仍在所限定的范圍內(nèi),直到i大于10跳出循環(huán),表示累加的操作已經(jīng)完成,最后將sum的值輸出。3.3.5do…while循環(huán)
do…while循環(huán)用于未知循環(huán)執(zhí)行次數(shù)的情況下。while循環(huán)和do…while循環(huán)的最大不同就是進入while循環(huán)前,while語句會先測試判斷條件的真假,再決定是否執(zhí)行循環(huán)主體,而do…while循環(huán)則是“先做再說”,每次都先執(zhí)行一次循環(huán)主體,然后再測試判斷條件的真假,所以無論循環(huán)成立的條件是什么,使用do…while循環(huán)時,至少都會執(zhí)行一次循環(huán)主體。當(dāng)循環(huán)主體只有一個語句時,可以將左、右大括號去掉。第一次進入do...while循環(huán)語句時,不管判斷條件(它可以是任何表達(dá)式)是否符合執(zhí)行循環(huán)的條件,都會直接執(zhí)行循環(huán)主體。循環(huán)主體執(zhí)行完畢,才開始測試判斷條件的值,如果判斷條件的值為真,則再次執(zhí)行循環(huán)主體,如此重復(fù)測試判斷條件,執(zhí)行循環(huán)主體,直到判斷條件的值為假,才會跳離do…while循環(huán)。下面列出了do…while循環(huán)執(zhí)行的流程:
(1)進入do...while循環(huán)前,為循環(huán)控制變量(或表達(dá)式)賦起始值。
(2)直接執(zhí)行循環(huán)主體,循環(huán)主體執(zhí)行完畢,才開始根據(jù)判斷條件的內(nèi)容決定是否繼續(xù)執(zhí)行循環(huán):條件判斷值為真(true)時,繼續(xù)執(zhí)行循環(huán)主體;條件判斷值為假(false)時,跳出循環(huán),執(zhí)行其他語句。
(3)執(zhí)行完循環(huán)主體內(nèi)的語句后,重新為循環(huán)控制變量(或表達(dá)式)賦值(增加或減少)。由于do…while循環(huán)和while循環(huán)一樣,不會自動更改循環(huán)控制變量(或表達(dá)式)的內(nèi)容,所以在do…while循環(huán)中賦值循環(huán)控制變量的工作要由自己來做。之后回到第(2)步重新判斷是否繼續(xù)執(zhí)行循環(huán)。
根據(jù)上述描述可以繪制出如圖3-16所示的do...while循環(huán)流程圖。圖3-16do…while循環(huán)的基本流程首先聲明程序中要使用的變量(循環(huán)記數(shù)及累加操作數(shù))及sum(累加的總和),并將sum設(shè)初值為0。由于要計算1?+?2?+?…?+?10,因此在第一次進入循環(huán)時將i的值設(shè)為1。接著判斷i是否小于等于10,如果i小于等于10,則計算sum+i的值后再指定給sum存放。當(dāng)i的值已經(jīng)不滿足循環(huán)條件時,i即會跳出循環(huán),表示累加的操作已經(jīng)完成,再輸出sum的值,程序結(jié)束運行。
程序說明:
(1)第8~12行利用do…while循環(huán)計算1~10的數(shù)的累加。
(2)第14行輸出1~10的數(shù)的累加結(jié)果:1+2+…+10=?55。
do...while循環(huán)不管條件是什么,都是先做再說,因此循環(huán)的主體最少會被執(zhí)行一次。在日常生活中,如果能夠多加注意,并不難找到do…while循環(huán)的影子。例如,在利用提款機提款前,會先進入輸入密碼的畫面,讓使用者輸入三次密碼,如果皆輸入錯誤,則會將銀行卡吞掉,其程序的流程就是利用do…while循環(huán)設(shè)計而成的。
3.3.6for循環(huán)
當(dāng)很明確地知道循環(huán)要執(zhí)行的次數(shù)時,就可以使用for循環(huán),其語句格式如下:若在循環(huán)主體中要處理的語句只有1個,則可以將大括號去掉。下面列出了for循環(huán)的流程:
(1)第一次進入for循環(huán)時,為循環(huán)控制變量賦起始值。
(2)根據(jù)判斷條件的內(nèi)容檢查是否要繼續(xù)執(zhí)行循環(huán),當(dāng)判斷條件值為真(true)時,繼續(xù)執(zhí)行循環(huán)主體內(nèi)的語句;當(dāng)判斷條件值為假(false)時,則會跳出循環(huán),執(zhí)行其他語句。
(3)執(zhí)行完循環(huán)主體內(nèi)的語句后,循環(huán)控制變量會根據(jù)增減量的要求,更改循環(huán)控制變量的值,再回到第(2)步重新判斷是否繼續(xù)執(zhí)行循環(huán)。
根據(jù)上述描述可以繪制出如圖3-17所示的for循環(huán)流程圖。
下例利用for循環(huán)來完成由1至10的數(shù)的累加運算。圖3-17for循環(huán)的基本流程3.3.7循環(huán)嵌套
當(dāng)循環(huán)語句中又出現(xiàn)循環(huán)語句時,就稱為嵌套循環(huán),如嵌套for循環(huán)、嵌套while循環(huán)等。當(dāng)然也可以使用混合嵌套循環(huán),也就是循環(huán)中又有其他不同種類的循環(huán)。下面以打印九九乘法表為例介紹嵌套循環(huán)的用法。
【例3-31】TestJava3_31.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 5星學(xué)霸數(shù)學(xué)下冊
- cmmi認(rèn)證正確定法
- 5分鐘拼讀英語
- 地質(zhì)隊領(lǐng)導(dǎo)工作實績
- anticipate的用法和搭配
- 田間小渠道施工方案
- 2025年重慶市眉山地區(qū)單招職業(yè)適應(yīng)性測試題庫學(xué)生專用
- 2025年新星職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫含答案
- 2025年信陽學(xué)院單招職業(yè)適應(yīng)性測試題庫附答案
- 2025年湖北國土資源職業(yè)學(xué)院單招職業(yè)適應(yīng)性測試題庫必考題
- 區(qū)域重力調(diào)查規(guī)范
- 人教版二年級下冊數(shù)學(xué)《圖形的運動(解決問題)》說課稿
- 中醫(yī)養(yǎng)生保健知識講座完整版
- YB/T 6328-2024 冶金工業(yè)建構(gòu)筑物安全運維技術(shù)規(guī)范(正式版)
- JTS-167-4-2012港口工程樁基規(guī)范
- 帕金森治療指南解讀
- 客戶服務(wù)與管理(微課版) 課件 項目三 呼入型客戶服務(wù)與管理
- 人教部編本八年級語文上冊第六單元復(fù)習(xí)課件共26張
- 騰訊社招測評題庫
- 家鄉(xiāng)二聲部合唱譜
- 2023年公共營養(yǎng)師之三級營養(yǎng)師全國通用試題
評論
0/150
提交評論