版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
2.1標(biāo)識符與關(guān)鍵字
2.2簡單計(jì)算
2.3基本數(shù)據(jù)類型
2.4運(yùn)算符
2.5程序流程控制
2.6方法2.7小結(jié)2.8習(xí)題
1.標(biāo)識符
Java用標(biāo)識符(identifier)表示變量名、類名和方法名,它們的命名要符合正確的命名規(guī)則,即合法的Java標(biāo)識符。Java中對正確標(biāo)識符的規(guī)定如下:
(1)標(biāo)識符必須由字母、下劃線“_”或美元符號“$”開頭。
2.1標(biāo)識符與關(guān)鍵字
(2)標(biāo)識符中的其他字符一定是字母、數(shù)字、下劃線或美元符號。
(3)標(biāo)識符的字符中不能有空格。
(4)一個(gè)標(biāo)識符的長度不能超過65535個(gè)字符。
Java語言區(qū)分字母大小寫,所以VALUE、Value、value表示不同的標(biāo)識符。
2.關(guān)鍵字
關(guān)鍵字(keyword)是Java語言為特殊目的而保留的標(biāo)識符,程序員不能改變它們,也不能作為一般標(biāo)識符來使用而賦予別的含義。表2-1列出了Java中的關(guān)鍵字。表2-1Java的關(guān)鍵字關(guān)鍵字const和goto當(dāng)前并未使用。單詞false、null和true都是為特定的目的而保留的,也不可以作變量名。關(guān)鍵字區(qū)分大小寫,并只由小寫字母構(gòu)成。
再來看一下第1章中的程序EarthToMoon.java。在類頭的定義中,有關(guān)關(guān)鍵字和標(biāo)識符的說明如圖2-1所示。圖2-1定義說明在這個(gè)程序中,其他標(biāo)識符的名字有main、String、args、System、out、println、n和paperThick。標(biāo)識符main是開始執(zhí)行程序的方法名;String和System是Java類名;args、out、n和paperThick是可以調(diào)用一些程序資源的變量;println是把信息送到控制窗口的方法名。
【例2-1】程序設(shè)計(jì)的目的是要解決一些實(shí)際問題。例如,根據(jù)給定的半徑計(jì)算出圓的面積。這里將π的值始終取為3.14,而半徑的值可以不斷變化,要求計(jì)算并顯示結(jié)果。
程序Area.java示例。2.2簡單計(jì)算程序運(yùn)行結(jié)果如圖2-2所示。圖2-2Area.java的運(yùn)行結(jié)果2.2.1常量
在計(jì)算中有一個(gè)不發(fā)生變化的數(shù)據(jù),即π的值被規(guī)定為3.14。在程序中用VALUE_PAI這個(gè)標(biāo)識符來表示。
常量是程序初始化內(nèi)存地址后,其值不能再改變的內(nèi)存地址的符號名稱,它必須是正確的Java標(biāo)識符。
計(jì)算中使用常量之前,必須先定義和初始化常量。常量的定義常常采用圖2-3所示的形式。圖2-3常量定義的形式在如下程序中,將VALUE_PAI定義為double類型的常量。(關(guān)于double類型的具體細(xì)節(jié)將在2.3節(jié)中討論。)
finaldoubleVALUE_PAI=3.14;
上述語句把VALUE_PAI與存放double類型數(shù)據(jù)3.14的內(nèi)存地址關(guān)聯(lián)起來。由于使用了修飾關(guān)鍵詞final,在程序執(zhí)行過程中,地址中的內(nèi)容是固定的;關(guān)鍵詞double表明定義的常量是double類型的值。從這時(shí)起,在方法main()中,VALUE_PAI與double值3.14是完全對應(yīng)的。圖2-4描繪了定義的結(jié)果(用鎖來表示不可變更的值)。圖2-4常量的定義結(jié)果
Java允許在一條語句中定義多個(gè)常量,之間用逗號分開。例如,下面的語句定義了兩個(gè)常量。
finaldoubleHEIGHT=500,WIDTH=150;
這種方式?jīng)]有單一語句那樣突出,且妨礙了注釋??紤]到程序的可讀性,一般不鼓勵(lì)這種方式定義常量。
另外,Java編程中有一個(gè)習(xí)慣,常量標(biāo)識符的名字采用大寫字母,單詞之間用下劃線隔開,且名稱對其目標(biāo)要具有描述性。例如,用VALUE_PAI來表示π。2.2.2變量
程序Area.java中除了使用常量,還使用了double類型的變量。變量是程序執(zhí)行過程中,內(nèi)容可以改變的內(nèi)存地址的符號名字。
使用變量的原則是“先說明后使用”,即變量在使用前必須先聲明,以便計(jì)算機(jī)留出相應(yīng)大小的存儲(chǔ)空間,用來存放在程序執(zhí)行過程中發(fā)生改變的數(shù)據(jù)?;镜淖兞慷x通常采用圖2-5所示的形式。圖2-5變量定義的形式程序中,radius、area都是double類型的局部簡單變量。因?yàn)樵诙x中沒有修飾符final,所以它們是變量;因?yàn)閷λ鼈兊氖褂脙H限于定義它們的方法,所以它們是局部變量。
doubleradius=2.5;
即變量radius初始化為double類型,值為2.5。radius定義的結(jié)果如圖2-6所示。因?yàn)閞adius的值可以改變,因此在它的描述中沒有鎖。圖2-6變量的定義結(jié)果如果沒有初始值,局部變量就沒有被初始化。對于下面這條語句:
doubleradius;
其定義結(jié)果如圖2-7所示。圖2-7無初始值變量的定義結(jié)果其中“-”表示未被初始化的值。盡管定義變量的時(shí)候可以不做初始化,但Java編譯器要求所有變量在使用之前必須初始化。否則在使用未初始化變量時(shí),編譯出錯(cuò)。
一條語句可以定義多個(gè)變量,其間用逗號分開。下面的語句就采用這種風(fēng)格定義并初始化變量weightInPounds(體重:用英鎊度量)和heightInFeet(身高:用英尺度量)。
doubleweightInPounds=70.5,heightInFeet=4.2;如果考慮程序的可讀性,比較好的定義風(fēng)格是一條語句定義一個(gè)變量。
另外,Java編程對變量的命名也遵循一定的習(xí)慣。變量標(biāo)識符的名稱應(yīng)該能描述它所代表的值,而且由小寫字母開始。如果變量名字僅由一個(gè)單詞構(gòu)成,那么整個(gè)名字都小寫,如radius、area;如果變量名字由多個(gè)單詞構(gòu)成,那么這些單詞連在一起,除了相連單詞(不包括第一個(gè)單詞)的第一個(gè)字母,其余字母都是小寫,如weightInPounds、heightInFeet等具有描述性的變量。2.2.3操作
先看程序Area.java中的一條語句:
doublearea=VALUE_PAI*radius*radius;
這條語句有以下幾個(gè)含義:
(1)定義了一個(gè)變量area,并進(jìn)行了初始化。
(2)?VALUE_PAI*radius*radius是一個(gè)表達(dá)式。
(3)將表達(dá)式VALUE_PAI*radius*radius的值賦給變量area。
(4)?area=VALUE_PAI*radius*radius;是一條賦值語句。在這條賦值語句中出現(xiàn)了符號“*”,它表示算術(shù)運(yùn)算中的乘法,被稱為算術(shù)運(yùn)算符??梢酝浦T如“+”、“-”、“/”等能實(shí)現(xiàn)算術(shù)運(yùn)算的符號都稱作算術(shù)運(yùn)算符。
那么什么是表達(dá)式呢?
表達(dá)式是算法語言的基本組成部分,它表示一種求值規(guī)則,通常由操作數(shù)、運(yùn)算符和圓括號組成。操作數(shù)是參加運(yùn)算的數(shù)據(jù),可以是常數(shù)、常量、變量或方法引用,如VALUE_PAI和radius,且出現(xiàn)的變量名必須已經(jīng)被初始化(值為2.5)。表達(dá)式按照運(yùn)算符的優(yōu)先級進(jìn)行計(jì)算,求得一個(gè)表達(dá)式的值。運(yùn)算符中圓括號的優(yōu)先級最高,運(yùn)算次序是“先內(nèi)層后外層”,因此先計(jì)算由圓括號括起來的子表達(dá)式。圓括號還可以多級嵌套。
Java規(guī)定了表達(dá)式的運(yùn)算規(guī)則,對操作數(shù)類型、運(yùn)算符性質(zhì)、運(yùn)算結(jié)果類型及運(yùn)算次序都做了嚴(yán)格的規(guī)定,程序員使用時(shí)必須嚴(yán)格遵循系統(tǒng)的規(guī)定,不得自定義。
在變量area的定義中用表達(dá)式VALUE_PAI*radius*radius的值來初始化。表達(dá)式用了double類型的乘法操作符?*,將常量VALUE_PAI與兩個(gè)變量radius相乘,結(jié)果表示圓的面積。程序的下一部分向用戶顯示關(guān)于圓的信息,這部分由兩個(gè)println()調(diào)用組成。
//顯示結(jié)果
System.out.println(“Theradiusis:”+radius);
System.out.println(“Theareaofthiscircleis:”+“
”+area);
第一個(gè)println()方法調(diào)用的功能是:把表達(dá)式?"Theradiusis:"+radius的值提供給println()。對于操作符“+”而言,當(dāng)它的兩個(gè)操作數(shù)都是數(shù)值型時(shí),操作符執(zhí)行加法;當(dāng)其中至少一個(gè)操作數(shù)是字符串(String)類型時(shí),操作符執(zhí)行String連接。
“Theradiusis:”和radius求值,因?yàn)閞adius的值是2.5,連接生成了一個(gè)值為?“Theradiusis:2.5”
的字符串,這個(gè)值成為println()調(diào)用的真正參數(shù)。這條語句執(zhí)行之后,程序輸出:
Theradiusis:2.5
與此類似,在執(zhí)行下一個(gè)println()方法調(diào)用時(shí):首先"Thearea
ofthiscircleis:"?和?""求值,連接生成了值為?"Theareaofthiscircleis:"的字符串;然后該值與變量area連接,由于area的值在初始化時(shí)通過計(jì)算、賦值已經(jīng)確定為19.625,因此生成字符串的值為?"Theareaofthiscircleis:19.625"。在這之后,程序輸出如下:
Theradiusis:2.5
Theareaofthiscircleis:19.625
至此,程序Area.java顯示了常量、變量的作用和一些基本操作。
Java的數(shù)據(jù)類型分為兩種,分別是基本類型和引用類型。
(1)基本類型(primitive):包括整數(shù)、字符、浮點(diǎn)和布爾等類型。
(2)引用類型(reference):包括數(shù)組、類和接口等類型。如按鈕、窗口等控件屬于引用類型變量。
2.3基本數(shù)據(jù)類型
Java在處理這兩種類型的數(shù)據(jù)時(shí),在存儲(chǔ)機(jī)制上采用了不同策略。Java將引用類型的對象通過new關(guān)鍵字存儲(chǔ)在“堆”里,但這種方式對于特別小的、簡單的變量,不是很有效。因此,對于這些類型需要特殊對待:通過創(chuàng)建一個(gè)并非“引用”的“自動(dòng)”變量,使得變量擁有“值”,并置于堆棧中,使之更加高效。這些需要特殊對待的類型就是Java中的基本類型。
Java的基本類型包括整型、字符型、浮點(diǎn)型和布爾型四類,每一類稱為一種數(shù)據(jù)類型(datatype)。數(shù)據(jù)類型定義了數(shù)據(jù)的性質(zhì)、取值范圍、存儲(chǔ)方式以及對數(shù)據(jù)所能進(jìn)行的運(yùn)算和操作。程序中的每一個(gè)數(shù)據(jù)都屬于一種類型,確定了數(shù)據(jù)的類型也就相應(yīng)地確定了數(shù)據(jù)的性質(zhì)以及對數(shù)據(jù)進(jìn)行的操作,同時(shí)數(shù)據(jù)也受到類型的保護(hù),確保了數(shù)據(jù)不被非法操作。
Java定義的基本數(shù)據(jù)類型,它們的分類及關(guān)鍵字如下:
整型:byte、short、int、long。
字符型:char。
浮點(diǎn)型:float、double。
布爾型:boolean。
可以看出,Java設(shè)置了多種數(shù)據(jù)類型,如byte、short、int和long,float和double。這樣做的目的是讓程序員能充分地利用特定的計(jì)算機(jī)硬件(如PCs、移動(dòng)電話、PDAs)所支持的各種類型。Java需確定每種基本類型所占存儲(chǔ)空間的大小。它們的大小并不像其他大多數(shù)語言那樣隨機(jī)器硬件架構(gòu)的變化而變化。這種所占存儲(chǔ)空間大小的不變性是Java程序具有可移植性的原因之一。2.3.1整數(shù)類型
Java定義了四種表示整數(shù)的整型:字節(jié)型(byte)、短整型(short)、整型(int)、長整型(long)。它們的特性如表2-2所示。表2-2整數(shù)類型一個(gè)整數(shù)隱含為整型(int)。當(dāng)要將一個(gè)整數(shù)強(qiáng)制表示為長整數(shù)時(shí),需在后面加L或l。
Java的整數(shù)有三種進(jìn)制的表示形式:
十進(jìn)制:用多個(gè)0~9之間的數(shù)字表示,如123和?-100,其首位不能為0。
八進(jìn)制:以字母0打頭,后跟多個(gè)0~7之間的數(shù)字,如0123。
十六進(jìn)制:以字母0x或0X打頭,后跟多個(gè)0~9之間的數(shù)字或a~f之間的小寫字母以及A~F之間的大寫字母,a~f或A~F分別表示值10~15,如0X123E。
關(guān)于int類型的操作在程序CelToFah.java中得到了演示。
【例2-2】整數(shù)攝氏溫度到整數(shù)華氏溫度的轉(zhuǎn)換。轉(zhuǎn)換公式為:Fahrenheit=32+(9/5)
Celsius。
publicclassCelToFah
{
publicstaticvoidmain(String[]args)
{//設(shè)置將被轉(zhuǎn)換的攝氏溫度
intcelsius=32;//轉(zhuǎn)換成相應(yīng)的華氏溫度
intfahrenheit=32+((9*celsius)/5);
//顯示結(jié)果
System.out.println("Celsiustemperatureis:"+celsius);
System.out.println("equalsFahrenheittemperatureis:"+fahrenheit);
}
}
程序運(yùn)行結(jié)果如圖2-8所示。圖2-8CelToFah.java的運(yùn)行結(jié)果2.3.2字符類型
字符型(char)用來存儲(chǔ)字符。一個(gè)字符用一個(gè)16位的Unicode碼表示。所有可見的ASCII字符都可以用單引號括起來成為字符,如?'a'、'A'、'#'?等。關(guān)于字符類型的特性如表2-3所示。表2-3字?符?類?型通常,程序員并不是用數(shù)字來表示字符,而是用單引號表示字符,編譯器會(huì)自動(dòng)將字符表達(dá)翻譯成Unicode編碼。比如,當(dāng)程序員需要使用字母a時(shí),用'a'而不是它的Unicode值97。由于char的表達(dá)本質(zhì)上是整數(shù),所以對整數(shù)定義的操作符也可以用于char變量和值。
Unicode字符集編碼按照值的大小有以下規(guī)則:
(一)順序規(guī)則
‘0’<‘1’<‘2’<…<‘9’
‘a(chǎn)’<‘b’<‘c’<…<‘z’
‘A’<‘B’<‘C’<…<‘Z’
(二)計(jì)算規(guī)則
對除9以外的任何數(shù)字d,表達(dá)式'd'+1都生成下一個(gè)數(shù)字的字符。例如,'7'+1生成'8'的Unicode值56。
對除z以外的任何小寫拉丁字母d,表達(dá)式‘d’+1都生成下一個(gè)小寫字母的字符。例如,‘b’+1生成‘c’的Unicode值99。
對除Z以外的任何大寫拉丁字母D,表達(dá)式‘D’+1都生成下一個(gè)大寫字母的字符。例如,‘O’+1生成‘P’的Unicode值80。
這些關(guān)系可以使字符按照它所代表的是小寫字母、大寫字母或數(shù)字來有效地分類。
關(guān)于上述char類型的性質(zhì),程序LowerToUpper.java給出了演示。
【例2-3】把一個(gè)小寫字母轉(zhuǎn)換成與它對應(yīng)的大寫字母。publicclassLowerToUpper
{
publicstaticvoidmain(String[]args)
{//設(shè)置相關(guān)的小寫字母
charlowerLetter='h';
//轉(zhuǎn)換成大寫字母
intupperLetter=‘A’+(lowerLetter-‘a(chǎn)’);
//顯示結(jié)果
System.out.println(“Lowercaseis:”+lowerLetter);
System.out.println(“Uppercaseis:"+(char)upperLetter);
}
}
程序運(yùn)行結(jié)果如圖2-9所示。
另外,還有一些控制字符不能直接顯示,可以利用轉(zhuǎn)義序列來表示,如表2-4所示。圖2-9LowerToUpper.java的運(yùn)行結(jié)果表2-4轉(zhuǎn)義序列
【例2-4】關(guān)于轉(zhuǎn)義序列的用法,參考程序CharOfChange.java。
publicclassCharOfChange
{
publicstaticvoidmain(String[]args)
{
//單引號前面可以不加\,直接輸出
System.out.println("Hesaid,\"Let’sstudycharof'\\'\"");
}
}
程序運(yùn)行結(jié)果如圖2-10所示。圖2-10CharOfChange.java的運(yùn)行結(jié)果2.3.3浮點(diǎn)類型
Java用浮點(diǎn)型表示數(shù)學(xué)中的實(shí)數(shù),包括整數(shù)部分和小數(shù)部分。浮點(diǎn)數(shù)用于需要小數(shù)位精確度的計(jì)算。例如,計(jì)算平方根或三角函數(shù)等,都會(huì)產(chǎn)生浮點(diǎn)型的值。浮點(diǎn)型有float(32位)和double(64位)兩種類型,分別稱作單精度型和雙精度型,其格式完全遵循IEEE754標(biāo)準(zhǔn)。關(guān)于浮點(diǎn)類型的特性如表2-5所示。表2-5浮點(diǎn)類型浮點(diǎn)數(shù)有兩種表示方式。
標(biāo)準(zhǔn)計(jì)數(shù)法:由整數(shù)部分和小數(shù)部分構(gòu)成,中間有小數(shù)點(diǎn)分開。整數(shù)部分或小數(shù)部分其中之一可以為空,如123.456、1.、.9、0.0等。
科學(xué)計(jì)數(shù)法:由十進(jìn)制整數(shù)、小數(shù)點(diǎn)、小數(shù)和指數(shù)部分構(gòu)成,指數(shù)部分由字母E或e加冪表示,如1.2345E+2、0.23E-4、-45.e+23、23.68E12都是用科學(xué)記數(shù)法表示的浮點(diǎn)數(shù),它們依次等于1.2345×102、0.23×10-4、-45×1023、23.68×1012。
一個(gè)浮點(diǎn)數(shù)隱含為double型。在一個(gè)浮點(diǎn)數(shù)后加字母F或f,可將其強(qiáng)制轉(zhuǎn)換為float型。
【例2-5】程序RealDemo.java演示浮點(diǎn)數(shù)的使用。
publicclassRealDemo
{
publicstaticvoidmain(String[]args)
{//對于float變量進(jìn)行賦值,小數(shù)后面必須加上f
floatx=123.456f;//對于double變量進(jìn)行賦值,小數(shù)后面不一定需要加上d
doubley1=23.789;
doubley2=78.654d;
//顯示結(jié)果
System.out.println("x="+x);
System.out.println("y1="+y1);
System.out.println("y2="+y2);
}
}
程序運(yùn)行結(jié)果如圖2-11所示。圖2-11RealDemo.java的運(yùn)行結(jié)果2.3.4布爾類型
布爾型(boolean)用來表示邏輯值,也稱為邏輯型。boolean是以19世紀(jì)英國數(shù)學(xué)家GeorgeBoole的名字命名的,正是他使邏輯值的研究正式化。boolean類型有真(true)和假(false)兩個(gè)值,并且這種類型所占存儲(chǔ)空間的大小沒有明確定義,僅定義為能夠取字面值true或false。true和false不能轉(zhuǎn)換成數(shù)字表示形式。
所有關(guān)系運(yùn)算(如a<b)的返回值都是布爾型的值,可以利用布爾型的值控制語句中的條件表達(dá)式,如if、while、for等語句。
2.2節(jié)通過分析一個(gè)簡單計(jì)算的操作過程,初步明確了運(yùn)算符與表達(dá)式的概念。在程序中,涉及了算術(shù)運(yùn)算符“*”和賦值運(yùn)算符“=”,并且分析了表達(dá)式的求值過程。
在實(shí)際操作中,Java定義了各種運(yùn)算操作,并提供了豐富的運(yùn)算操作符。當(dāng)一個(gè)表達(dá)式中存在多個(gè)操作符時(shí),就需要考慮各部分的計(jì)算順序。而這個(gè)順序就由操作符的優(yōu)先級和結(jié)合規(guī)則來確定。因此在學(xué)習(xí)Java的運(yùn)算符操作之前,必須先對優(yōu)先級有一個(gè)初步的掌握。2.4運(yùn)算符2.4.1優(yōu)先級
先看一條語句:
intx=3*5/2;
按照整型的計(jì)算規(guī)則,結(jié)果是7還是6呢?這取決于表達(dá)式的計(jì)算順序。如果按照(3*5)/2的順序計(jì)算,結(jié)果是7;如果按照3*(5/2)的順序計(jì)算,結(jié)果是6。由于在算術(shù)運(yùn)算中乘法與除法的運(yùn)算級別相同,在沒有設(shè)定括號的前提下,表達(dá)式按照自左向右(被稱為“左結(jié)合”)的順序計(jì)算,因此語句的執(zhí)行結(jié)果是7。大多運(yùn)算符按照從左向右的次序進(jìn)行計(jì)算,少數(shù)運(yùn)算符的運(yùn)算次序是從右向左的(被稱為“右結(jié)合”),如賦值運(yùn)算符、三元條件運(yùn)算符等,后面將進(jìn)行講解。再看下面的表達(dá)式:
4/2+8 //除法優(yōu)先級高于加法
-4*8 //取反優(yōu)先級高于乘法
12+15%/2 //取余數(shù)優(yōu)先級高于加法
Java對操作符的優(yōu)先級做了嚴(yán)格的規(guī)定,程序員使用時(shí)必須嚴(yán)格遵循系統(tǒng)的規(guī)定,不得自定義。括號可以用來改變計(jì)算的順序。例如:
inta=x+y-2/2+z;
為上述表達(dá)式加上括號后,就有了不同的含義:
inta=x+(y-2)/(2+z);
可以想象,利用括號的嵌套,可以完成更為復(fù)雜的運(yùn)算關(guān)系,如:
inta=(2+(3+5)*10)/(6-4);先計(jì)算子表達(dá)式(3+5),然后再計(jì)算外層括號中的表達(dá)式,結(jié)果為41。
另外,需要注意的用法是,括號經(jīng)常在不必需的地方使用,以明確運(yùn)算順序。這個(gè)技巧更易于讀者理解程序代碼。例如,表達(dá)式x*y+x/y-z和帶括號的表達(dá)式(x*y)+(x/y)-z進(jìn)行同樣的計(jì)算,但是后者具有更加明確的意思。2.4.2賦值運(yùn)算符
1.賦值運(yùn)算
賦值運(yùn)算的作用是使變量獲得值。賦值的格式如下:
<變量名>=<表達(dá)式>
其中,“=”是賦值運(yùn)算符,它有兩個(gè)操作數(shù)(“=”被稱為二元操作符):左邊的操作數(shù)是目標(biāo)變量;右邊的操作數(shù)是表達(dá)式。運(yùn)算時(shí),賦值操作符根據(jù)表達(dá)式的結(jié)果更新與目標(biāo)變量對應(yīng)的內(nèi)存地址中的值,即先計(jì)算<表達(dá)式>的值,再將表達(dá)式的結(jié)果值賦給<變量名>。因此,賦值的運(yùn)算次序是從右向左的,即“右結(jié)合”。
表2-6執(zhí)行了一系列賦值語句,每條語句執(zhí)行后,變量對應(yīng)的內(nèi)存發(fā)生了變化,直觀地體現(xiàn)了賦值語句的執(zhí)行過程。表2-6賦值語句的執(zhí)行過程
2.賦值運(yùn)算的語法錯(cuò)誤
賦值中的變量名必須已聲明,而且表達(dá)式必須能計(jì)算出確定的值,否則將產(chǎn)生編譯錯(cuò)誤。例如,程序FuZhi1.java和程序FuZhi2.java分別驗(yàn)證了這些要求。
【例2-6】FuZhi1.java程序。
publicclassFuZhi1
{
publicstaticvoidmain(String[]args)
{
k=10;
System.out.println(“k=”+k);
}
}
當(dāng)k聲明時(shí),系統(tǒng)將產(chǎn)生“不能解析符號”的編譯錯(cuò)誤,程序運(yùn)行結(jié)果如圖2-12所示。圖2-12FuZhi1.java的運(yùn)行結(jié)果【例2-7】FuZhi2.java程序。
publicclassFuZhi2
{
publicstaticvoidmain(String[]args)
{
inti,k;
k=i+10;
}
}
由于變量i沒有具體的值,不能參加運(yùn)算,系統(tǒng)將產(chǎn)生“變量i可能還未被初始化”的編譯錯(cuò)誤,程序運(yùn)行結(jié)果如圖2-13所示。圖2-13FuZhi2.java的運(yùn)行結(jié)果
3.賦值的優(yōu)先級和結(jié)合律
先看下面這條賦值語句:
x=9*10;
賦值操作符會(huì)產(chǎn)生一個(gè)值,這個(gè)值被看做是賦值操作的值,即左操作數(shù)(x)的新值。假設(shè)x和y是已經(jīng)定義好的int變量,此賦值語句之前的語句計(jì)算出15,又把15存儲(chǔ)在變量x中。由于賦值生成了一個(gè)值,進(jìn)而可以寫出下面的表達(dá)式:
y=x=9*10;這個(gè)賦值表達(dá)式意味著什么呢?關(guān)鍵在于對賦值操作符優(yōu)先級與結(jié)合律的理解。正確的編譯是9與10先作乘法,于是“=”的優(yōu)先級低于“*”,因此,上面的表達(dá)式編譯為:
y=x=(9*10);
再觀察x的兩邊都有賦值操作符“=”,這種情況下,“=”的結(jié)合律決定了x是與右邊的“=”先結(jié)合,還是與左邊的“=”先結(jié)合。由于賦值操作符是右結(jié)合的,因此,表達(dá)式的正確編譯為:
y=(x=(9*10));
它表明將賦值操作x=(9*10)的值90賦給變量y,于是賦值操作y=(x=(9*10))的值是90。
4.復(fù)合賦值
語句“i=i+5;”完成的功能很簡單,即取出變量i中的值,再加上5,將結(jié)果再存儲(chǔ)到變量i中。
Java有一個(gè)完成同樣功能的復(fù)合加法運(yùn)算,寫作:
i+=5;
“+=”是一種特殊的操作符,用它進(jìn)行常見的操作,可以認(rèn)為是編程語言的簡化。其他一些復(fù)合賦值操作符是-=、*=、/=、%=,它們依次對目標(biāo)變量進(jìn)行減法、乘法、除法和求余運(yùn)算,再把值賦給目標(biāo)變量。
將復(fù)合運(yùn)算的概念進(jìn)行延伸,可以涉及到其他的運(yùn)算操作,如表2-7所示。表中涉及到的運(yùn)算將在接下來的內(nèi)容中進(jìn)行講解。表2-7賦值運(yùn)算符與其他運(yùn)算符的簡捷使用方式
5.賦值相容
如果目標(biāo)變量與表達(dá)式的類型是相同的,就可以賦值,稱為類型相同。如果兩者類型不相同,并且目標(biāo)變量類型比表達(dá)式類型長時(shí),系統(tǒng)會(huì)自動(dòng)將表達(dá)式轉(zhuǎn)化為較長的類型,如int型轉(zhuǎn)化為long型,這時(shí)也可以賦值,稱為賦值相容(assignmentcompatible)。
例如:
longbigValue=99L;//類型相同
longbigval=6;
//6是int型,自動(dòng)轉(zhuǎn)化為long型,賦值相容
doublez=12.414F //12.414F是float型,賦值相容如果變量類型比表達(dá)式類型短,則賦值不相容,編譯時(shí)產(chǎn)生“可能存在的精度損失”的錯(cuò)誤。例如,
intsmallval=99L //99L是long型,賦值不相容
floatz1=12.414; //12.414是double型,賦值不相容
賦值不相容時(shí),需要使用強(qiáng)制類型轉(zhuǎn)換,其格式如下:
(<目標(biāo)類型>)<表達(dá)式>
例如,
i=(int)99L;
//數(shù)值的轉(zhuǎn)換
intj=(int)(bigValue); //變量的轉(zhuǎn)換
將long型轉(zhuǎn)換為int型后,可以賦值。2.4.3算術(shù)運(yùn)算符
Java的算術(shù)運(yùn)算符分為一元運(yùn)算符和二元運(yùn)算符。一元運(yùn)算符只有一個(gè)操作數(shù),而二元運(yùn)算符有兩個(gè)操作數(shù)參加運(yùn)算。
1.一元運(yùn)算符:一元正(+),一元負(fù)(-)
inti=10,j,k;
j=+i; //取i的原值,則j=10
k=-i; //取與i相反符號的值,則k=-10一元運(yùn)算符與操作數(shù)之間不允許有空格。
編譯器能正確識別下面的這條語句:
k=5*-i;
執(zhí)行結(jié)果是-50。但讀者在閱讀程序的時(shí)候會(huì)感到費(fèi)解,所以最好明確地寫成:
k=(5*-i);
2.二元運(yùn)算符:加(+),減(-),乘(*),除(/)和取余(%)
其中,+、-、*、/完成加、減、乘、除四則運(yùn)算,%則是求兩個(gè)操作數(shù)相除的余數(shù)。這五種運(yùn)算符均適用于整型和浮點(diǎn)型。當(dāng)在不同數(shù)據(jù)類型的操作數(shù)之間進(jìn)行算術(shù)運(yùn)算時(shí),所得結(jié)果的類型與精度最高的那種類型一致。程序SuanShu.java列舉了算術(shù)運(yùn)算中的典型操作,下面請仔細(xì)分析其運(yùn)行結(jié)果。
【例2-8】SuanShu.java程序。publicclassSuanShu
{
publicstaticvoidmain(String[]args)
{
System.out.println("3*4="+3*4);
System.out.println("3*4.0="+3*4.0);
System.out.println("15/2="+15/2);
System.out.println("15.2/2="+15.2/2);
System.out.println("7%2="+7%2);
System.out.println("-7%2="+-7%2);
System.out.println("7%-2="+7%-2);
System.out.println("7.0%2="+7.0%2);
}
}
程序運(yùn)行結(jié)果如圖2-14所示。圖2-14SuanShu.java的編譯結(jié)果從結(jié)果中可以得到一些運(yùn)算規(guī)則:
(1)整數(shù)除法會(huì)直接去掉結(jié)果的小數(shù)位,而不是四舍五入地求整數(shù)位。
(2)整數(shù)求余,其結(jié)果的符號與被除數(shù)相同。
(3)求余操作數(shù)中只要有浮點(diǎn)數(shù),結(jié)果即為浮點(diǎn)數(shù)。
3.一個(gè)小應(yīng)用
用變量w表示今天是星期幾,對應(yīng)關(guān)系如表2-8所示。假設(shè)w=1表示今天是星期一,如何利用w表示明天(星期二)和昨天(星期天)。表2-8w與星期幾的對應(yīng)關(guān)系利用整數(shù)求余就可以很容易地解決這個(gè)問題,解決辦法如下:
tomorrow=(w+1)%7; //值為2:明天
yesterday=(w-1+7)%7; //值為0:昨天
根據(jù)這道題的解決思路,可以考慮:怎樣表示月份的上一個(gè)月和下一個(gè)月?2.4.4類型轉(zhuǎn)換
在前面的講解中,已經(jīng)涉及到了數(shù)值表達(dá)式中的操作數(shù)為不同類型的情況,并且我們對類型的轉(zhuǎn)換作了簡單介紹?,F(xiàn)在對類型轉(zhuǎn)換再進(jìn)行一些系統(tǒng)的討論。
如果加法的一個(gè)操作數(shù)是int型,另一個(gè)操作數(shù)是char型,如何計(jì)算?或者,乘法的一個(gè)操作數(shù)是int型,另一個(gè)操作數(shù)是double型,又如何計(jì)算?這就需要進(jìn)行類型轉(zhuǎn)換。Java有兩種轉(zhuǎn)換基本類型的方法:自動(dòng)提升和強(qiáng)制轉(zhuǎn)換。
1.自動(dòng)提升
Java在進(jìn)行任何運(yùn)算之前,編譯器在必要的時(shí)候會(huì)自動(dòng)進(jìn)行類型的提升。
程序TypeAutoUpdate.java對七種基本類型進(jìn)行了兩兩運(yùn)算,從結(jié)果就可以看出系統(tǒng)在運(yùn)算的時(shí)候,進(jìn)行了類型轉(zhuǎn)換。
【例2-9】TypeAutoUpdate.java程序。publicclassTypeAutoUpdate
{
publicstaticvoidmain(String[]args)
{byteb=100;
charc='a';
shorts=1000;
inti=40000;
longl=20000L;
floatf=25.4f;
doubled=5.5;
doubleresult=(f*b)+(l*f)+(i/c)+(d*s);System.out.println("f*b(25.4f*100)="+f*b);
System.out.println("l*f(20000L*25.4f)="+l*f);
System.out.println("i/c(40000/'a')="+i/c);
System.out.println("d*s(5.5*1000)="+d*s);
System.out.println("result="+result);
}
}
程序運(yùn)行結(jié)果如圖2-15所示。圖2-15TypeAutoUpdate.java的執(zhí)行結(jié)果對于結(jié)果,有以下幾點(diǎn)說明:
(1)計(jì)算(f*b)時(shí),b自動(dòng)提升為float型。
(2)計(jì)算(l*f)時(shí),l自動(dòng)提升為float型。
(3)計(jì)算(i/c)時(shí),c自動(dòng)提升為int型。
(4)計(jì)算(d*s)時(shí),s自動(dòng)提升為double型。
(5)再相加時(shí),中間結(jié)果都變?yōu)閐ouble型,所以result只能聲明為double型,聲明為其他類型就會(huì)出錯(cuò)。通常,表達(dá)式中出現(xiàn)的最大的數(shù)據(jù)類型決定了表達(dá)式最終結(jié)果的數(shù)據(jù)類型。
(6)?Java允許把任何基本類型轉(zhuǎn)換成別的基本數(shù)據(jù)類型,但布爾型除外,因?yàn)樗静辉试S進(jìn)行任何類型的轉(zhuǎn)換處理。
自動(dòng)提升的規(guī)則如下:
(1)所有的byte型和short型的值被提升到int型。
(2)整數(shù)運(yùn)算時(shí),如果有一個(gè)運(yùn)算數(shù)是long型,則其他運(yùn)算數(shù)的值都被提升到long型。
(3)浮點(diǎn)運(yùn)算時(shí),如果有一個(gè)運(yùn)算數(shù)是float型,則其他整數(shù)值都被提升到float型。
(4)浮點(diǎn)運(yùn)算時(shí),如果有一個(gè)運(yùn)算數(shù)是double型,則其他運(yùn)算數(shù)的值都被提升到double型,計(jì)算結(jié)果也是double型。類型的自動(dòng)提升發(fā)生的條件是:兩種類型是兼容的,或者目標(biāo)類型的范圍比原類型的范圍大。
當(dāng)目標(biāo)類型的范圍能容納原類型的信息時(shí),不會(huì)造成任何信息的丟失,這種轉(zhuǎn)換被稱為“擴(kuò)展轉(zhuǎn)換”(wideningconversion)。然而如果要執(zhí)行一種名為“窄化轉(zhuǎn)換”(narrowingconversion)的操作,即目標(biāo)類型的范圍不能容納原來類型的信息時(shí),就有可能面臨信息丟失的危險(xiǎn)。此時(shí),編譯器會(huì)強(qiáng)制我們進(jìn)行類型轉(zhuǎn)換。
2.強(qiáng)制轉(zhuǎn)換
除自動(dòng)提升情況之外,要想轉(zhuǎn)換數(shù)據(jù)類型,需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換。強(qiáng)制類型轉(zhuǎn)換的方法是:在數(shù)據(jù)前放一對包括新的類型名的括號,其格式如下:
(目標(biāo)類型)<表達(dá)式>
如語句“inti=(int)66666L;”表示將long型的66666L轉(zhuǎn)換成int型,然后賦給變量i。閱讀程序ForceChange.java,分析結(jié)果。
【例2-10】ForceChange.java程序。publicclassForceChange
{
publicstaticvoidmain(String[]args)
{
doubled=390.456;
floatf=(float)d;
longl=(long)d;
inti=(int)d;
shorts=(short)d;
byteb=(byte)d;
System.out.println("d=390.456");
System.out.println("(float)d="+f);
System.out.println("(long)d="+l);
System.out.println("(int)d="+i);
System.out.println("(short)d="+s);
System.out.println("(byte)d="+b);
System.out.println("(char)65="+(char)65);
}
}
程序運(yùn)行結(jié)果如圖2-16所示。圖2-16ForceChange.java的執(zhí)行結(jié)果2.4.5自增與自減運(yùn)算符
遞增和遞減運(yùn)算是兩種相當(dāng)不錯(cuò)的快捷運(yùn)算(常稱作“自動(dòng)遞增”和“自動(dòng)遞減”運(yùn)算)。其中,遞減操作符是“--”,意思是“減少一個(gè)單位”;遞增操作符是“++”,意思是“增加一個(gè)單位”。比如,若定義“inti=10;”,則++i就等價(jià)于“i=i+1”。遞增和遞減操作符不僅改變了變量,并且以變量的值作為生成的結(jié)果。這兩種操作符各有兩種使用方式,通常稱為“前綴式”和“后綴式”。“前綴式”表示運(yùn)算符位于變量或表達(dá)式的前面,如++j、--j;“后綴式”表示運(yùn)算符位于變量或表達(dá)式的后面,如j++、j--。那么前綴形式與后綴形式有什么區(qū)別呢?看下面兩段代碼的執(zhí)行結(jié)果。
代碼一:
inti=10;
System.out.println(i++);//結(jié)果:10
代碼二:
inti=10;
System.out.println(++i);//結(jié)果:11為什么結(jié)果是這樣呢?原因是:對于前綴式使用方式而言,先執(zhí)行變量的遞增或遞減運(yùn)算,再返回生成的值參與其他運(yùn)算;對于后綴式使用方式而言,先返回變量的原值參與其他運(yùn)算,再執(zhí)行變量的遞增或遞減運(yùn)算。
表2-9執(zhí)行了一系列遞增遞減語句,觀察語句執(zhí)行后變量所對應(yīng)內(nèi)存發(fā)生的變化,并分析運(yùn)行結(jié)果。表2-9遞增遞減語句的執(zhí)行過程從執(zhí)行結(jié)果可以看出:++i(++j)返回變量增加后的值,j--返回變量減少之前的值。
但是在編程時(shí),切忌不恰當(dāng)?shù)厥褂眠f增和遞減運(yùn)算符,使得程序變得很費(fèi)解。像下面的語句:
intk=5+i++*++j;
下面的代碼段與它是等同的,但是比它容易理解多了。
++j;
intk=5+(i*j);
++i;2.4.6關(guān)系運(yùn)算符
關(guān)系運(yùn)算符用于比較兩個(gè)值之間的大小,結(jié)果返回布爾值,它們計(jì)算的是操作數(shù)的值之間的關(guān)系。如果關(guān)系是真的,關(guān)系表達(dá)式會(huì)生成true(真);如果關(guān)系不真實(shí),則生成false(假)。關(guān)系運(yùn)算符有6種:等于(==)、不等于(!=)、大于(>)、大于等于(>=)、小于(<)和小于等于(<=),例如:
3<=2; //結(jié)果:false
‘A’<‘a(chǎn)’; //結(jié)果:true
閱讀程序RelationOperate.java,分析結(jié)果?!纠?-11】RelationOperate.java程序。
publicclassRelationOperate
{
publicstaticvoidmain(String[]args)
{
intx=9,y=11;
booleanresult;
System.out.println("x="+x+"y="+y);
System.out.println("x==y"+(x==y));
System.out.println("x!=y"+(x!=y));
System.out.println("x<y"+(x<y));
System.out.println("x<=y"+(x<=y));
System.out.println("x>y"+(x>y));
System.out.println("x>=y"+(x>=y));
result=((x!=y)==true);
System.out.println("x!=y"+result);
}
}
程序運(yùn)行結(jié)果如圖2-17所示。圖2-17RelationOperate.java的執(zhí)行結(jié)果在使用“==”運(yùn)算符時(shí),程序員會(huì)犯一個(gè)常見的錯(cuò)誤,如下面的程序:
while(x=y){
…
}
盡管還沒有學(xué)習(xí)程序結(jié)構(gòu)設(shè)計(jì),但從語意上可以推斷:程序員很明顯是想測試是否相等(==),而不是進(jìn)行賦值操作(=)。在Java中,賦值操作的結(jié)果并不是布爾值,而編譯器期望的是一個(gè)布爾值。由于Java不會(huì)自動(dòng)地將int數(shù)值轉(zhuǎn)換成布爾值,所以在編譯時(shí)會(huì)拋出一個(gè)錯(cuò)誤,阻止程序進(jìn)一步運(yùn)行。2.4.7邏輯運(yùn)算符
邏輯運(yùn)算符只能處理布爾值,所得結(jié)果也都是布爾值。Java的邏輯操作符有:“與”(&&)、“或”(||)、“非”(!)。它們能根據(jù)參數(shù)的邏輯關(guān)系,生成一個(gè)布爾值。邏輯運(yùn)算符的真值表如表2-10所示。表2-10邏輯運(yùn)算符的真值表例如:
out.println((i>0)&&(i<9)); //判斷i值是否在0~9之間
System.out.println((ch=='A')||ch=='a'); //判斷ch是否為字母A或a
另外,&&和||運(yùn)算符還有一個(gè)有趣的屬性——“短路”現(xiàn)象(short-circuit)。對于&&運(yùn)算符而言,從左向右依次逐個(gè)計(jì)算條件是否成立,一旦發(fā)現(xiàn)有一個(gè)條件不成立,就立即終止計(jì)算并且得到復(fù)合條件的結(jié)果值為false,不再計(jì)算余下的條件是否成立,因此表達(dá)式靠后的部分有可能不會(huì)被運(yùn)算。同樣,對于||運(yùn)算符而言,從左向右依次逐個(gè)計(jì)算條件是否成立,一旦發(fā)現(xiàn)有一個(gè)條件成立,就立即終止計(jì)算并且得到復(fù)合條件的結(jié)果值為true,不再計(jì)算其余的條件。例如有3個(gè)用&&連接的表達(dá)式,當(dāng)計(jì)算第一個(gè)為false時(shí),那么整個(gè)邏輯表達(dá)式為false,其余的兩個(gè)表達(dá)式將不再計(jì)算。程序ShortCircuit.java表明了這一點(diǎn)?!纠?-12】ShortCircuit.java程序。
publicclassShortCircuit
{
publicstaticvoidmain(String[]args)
{
intn=5;
intm=8;
System.out.println("compareresultis:"+((n>m)&&(++n)>m));
System.out.println("nis"+n);
System.out.println("compareresultis:"+((n<m)&&(++n)>m));
System.out.println("nis"+n);
System.out.println("compareresultis:"+((n<m)||(++n)>m));
System.out.println("nis"+n);
}
}
程序運(yùn)行結(jié)果如圖2-18所示。圖2-18ShortCircuit.java的執(zhí)行結(jié)果對結(jié)果進(jìn)行分析如下:
(1)程序首先計(jì)算下面的表達(dá)式:
(n>m)&&(++n)>m
因?yàn)閚>m為false,因此整個(gè)表達(dá)式為false,程序不再計(jì)算(++n)>m,所以n仍然為5,沒有機(jī)會(huì)增加1了。
(2)程序接著計(jì)算下面的表達(dá)式:
(n<m)&&(++n)>m因?yàn)閚<m為true,無法確定整個(gè)邏輯表達(dá)式的值,所以要接著計(jì)算(++n)>m的值,無論結(jié)果怎樣,n的值終于加1成為6。
(3)程序最后計(jì)算下面的表達(dá)式:
(n<m)||(++n)>m)
因?yàn)閚<m為true,因此整個(gè)表達(dá)式為true,程序不再計(jì)算(++n)>m,所以n仍然為6,沒有機(jī)會(huì)增加1了。2.4.8位運(yùn)算符
位運(yùn)算是對整數(shù)基本數(shù)據(jù)類型中的單個(gè)“比特”(bit)進(jìn)行操作,是對數(shù)據(jù)進(jìn)行按位操作的手段。位運(yùn)算符對兩個(gè)參數(shù)中對應(yīng)的位執(zhí)行布爾代數(shù)運(yùn)算,并最終生成一個(gè)結(jié)果。Java的位運(yùn)算符有:非(~)、與(&)、或(?|?)、異或(?^?)。位運(yùn)算符的真值表如表2-11所示。表2-11位運(yùn)算符的真值表例如:
6|2=6 等價(jià)于二進(jìn)制 0110|0010=0110
4&2=0 等價(jià)于二進(jìn)制 0100&0010=0000
6^2=4 等價(jià)于二進(jìn)制 0110^0010=0100
~4=-5 等價(jià)于二進(jìn)制 ~00000100=11111011
現(xiàn)在來做一個(gè)小測試:一個(gè)值的第3位是否被設(shè)置成了1?
解決思路:用1和第3位作與運(yùn)算,用0和其余位作與運(yùn)算,觀察結(jié)果。如果結(jié)果是0,第3位是0,否則,第3位被置成1。閱讀程序BitOperate.java,運(yùn)行結(jié)果如圖2-19所示?!纠?-13】BitOperate.java程序。
publicclassBitOperate
{
publicstaticvoidmain(String[]args)
{intx=12;
//8的二進(jìn)制表示為00001000(滿足第3位是1,其余位是0的條件)inttest=8;
intresult=x&test;
if(result==0)
System.out.println("Bit3isnotset.");
if(result!=0)
System.out.println("Bit3isset.");
}
}圖2-19BitOperate.java的執(zhí)行結(jié)果當(dāng)&、^和|操作符處理布爾值true/false時(shí),它們被看做是位邏輯運(yùn)算符。位邏輯運(yùn)算符和位運(yùn)算符的工作方式相同(用false代替0,true代替1)。真值表如表2-12所示。表2-12位邏輯運(yùn)算符的真值表與表2-10做一個(gè)比較會(huì)發(fā)現(xiàn):位邏輯運(yùn)算符和邏輯運(yùn)算符在“與”、“或”的運(yùn)算規(guī)則上完全相同。那么它們在使用上有什么差別呢?前面講過,&&?和?||?運(yùn)算符具有“短路”現(xiàn)象,而&和|運(yùn)算符沒有這種現(xiàn)象。在計(jì)算表達(dá)式的值的時(shí)候,它們會(huì)做完所有的運(yùn)算,再返回整個(gè)邏輯表達(dá)式的值。將程序ShortCircuit.java進(jìn)行改寫,比較一下結(jié)果。
【例2-14】改寫后的ShortCircuit.java程序。publicclassShortCircuit
{
publicstaticvoidmain(String[]args)
{
intn=5;
intm=8;
System.out.println("compareresultis:"+((n>m)&(++n)>m));
System.out.println("nis"+n);
System.out.println("compareresultis:"+((n<m)|(++n)>m));
System.out.println("nis"+n);
}
}
程序運(yùn)行結(jié)果如圖2-20所示。圖2-20改寫后的ShortCircuit.java的執(zhí)行結(jié)果2.4.9移位運(yùn)算符
使用移位操作符可以將一個(gè)數(shù)字的所有位向左或者向右移動(dòng)指定數(shù)目的二進(jìn)制位。Java提供的移位運(yùn)算符有:右移位(>>)、無符號右移位(>>>)、左移位(<<)。
右移位運(yùn)算符考慮操作數(shù)的符號,因?yàn)樨?fù)值意味著最左邊一位是1,向右移位負(fù)數(shù)將在左邊產(chǎn)生一個(gè)新的1。如果希望操作數(shù)字實(shí)際的位,并在移位負(fù)數(shù)時(shí)不在左端附加1,使用無符號右移位運(yùn)算符(>>>,也稱為零填充右移位運(yùn)算符)。不管被移位的數(shù)字是正還是負(fù),它在左端產(chǎn)生一個(gè)0,例如:
9>>2=11001右移2位為0010
1<<2=40001左移2位為0100
程序MoveBit.java演示了移位操作,運(yùn)行結(jié)果清楚地表明了操作規(guī)則。
【例2-15】MoveBit.java程序。
publicclassMoveBit
{
publicstaticvoidmain(String[]args)
{
inta=12;
intb=-12;
inttemp;
System.out.println("12的二進(jìn)制表示:"+Integer.toBinaryString(a));
temp=12>>1;//結(jié)果:6
System.out.println("12>>1:"+Integer.toBinaryString(temp));
temp=12<<1;//結(jié)果:24
System.out.println("12<<1:"+Integer.toBinaryString(temp));
System.out.println("-12的二進(jìn)制表示:");System.out.println(""+Integer.toBinaryString(-12));
temp=-12>>1;//結(jié)果:-6
System.out.println("-12>>1:"+Integer.toBinaryString(temp));
temp=-12>>>1;//結(jié)果:2147483642
System.out.println("-12>>>1:"+Integer.toBinaryString(temp));
}
}
程序運(yùn)行結(jié)果如圖2-21所示。圖2-21MoveBit.java的執(zhí)行結(jié)果2.4.10三元條件運(yùn)算符
三元運(yùn)算符(?:)比較特別,它有三個(gè)操作數(shù):一個(gè)條件和兩個(gè)值。定義形式如下:
boolean-exp?value1:value2
該運(yùn)算符的作用是:如果“boolean-exp”(布爾表達(dá)式)的結(jié)果為true,就計(jì)算“value1”,而且這個(gè)計(jì)算結(jié)果也就是運(yùn)算符最終產(chǎn)生的值;如果“boolean-exp”的結(jié)果為false,就計(jì)算“value2”,同樣,它的結(jié)果也就成為運(yùn)算符最終產(chǎn)生的值。例如:
inta=1,b=2,max;
max=a>b?a:b; //max獲得a,b之中的較大值
System.out.println(“max=”+max); //輸出結(jié)果為max=2
現(xiàn)在來看一個(gè)小實(shí)例:將一個(gè)0~15之間的整數(shù)轉(zhuǎn)換為十六進(jìn)制數(shù),并顯示出來。
三元運(yùn)算符解決這個(gè)問題很理想,可以用它返回需要的值:如果這個(gè)數(shù)小于10(x<10),返回該數(shù)據(jù)對應(yīng)的字符值('0'+x);否則,將這個(gè)數(shù)轉(zhuǎn)換成十六進(jìn)制字母所對應(yīng)的字符值('a'+(x-10))。該功能由程序ThreeElementOperate.java完成?!纠?-16】ThreeElementOperate.java程序。
publicclassThreeElementOperate
{
publicstaticvoidmain(String[]args)
{
intx=14;
intresult=(x<10)?('0'+x):('a'+(x-10));
System.out.println(x+"=0x"+(char)result);
}
}
程序運(yùn)行結(jié)果如圖2-22所示。圖2-22ThreeElementOperate.java的執(zhí)行結(jié)果2.5.1順序結(jié)構(gòu)
1.結(jié)構(gòu)說明
一般情況下,順序結(jié)構(gòu)的程序按語句的書寫次序依次順序執(zhí)行(sequentialexecution),如圖2-23所示。先執(zhí)行<語句或塊A>,再執(zhí)行<語句或塊B>。這種結(jié)構(gòu)的程序具有線性屬性,對于解決簡單的問題已經(jīng)足夠了。順序結(jié)構(gòu)是最簡單的一種基本結(jié)構(gòu)。2.5程序流程控制圖2-23順序結(jié)構(gòu)示意圖
2.應(yīng)用舉例
【例2-17】求一個(gè)三位數(shù)的數(shù)字之和。
首先求得這個(gè)三位數(shù)的個(gè)、十、百位上的數(shù)字,將各位數(shù)字相加就是該三位數(shù)的數(shù)字之和。程序清單如下:
publicclassDigSum3
{
publicstaticvoidmain(String[]args)
{
intn=123;
inta=0,b=0,c=0;
intdigsum=0;
a=n%10; //a:個(gè)位
b=(n%100)/10; //b:十位
c=n/100; //c:百位
digsum=a+b+c;圖2-24DigSum3.java的執(zhí)行結(jié)果
System.out.println("Digsum("+n+")="+digsum);
}
}
程序運(yùn)行結(jié)果如圖2-24所示。圖2-24DigSum3.java的執(zhí)行結(jié)果
【例2-18】判斷一個(gè)年份是否為閏年。
根據(jù)天文歷法規(guī)定,每400年中有97個(gè)閏年。凡不能被100整除但能被4整除的年份,或能被400整除的年份是閏年,其余年份是平年。如1996、2000是閏年,而1900是平年。
本例演示布爾型的運(yùn)算。對一個(gè)年份year,按上述條件進(jìn)行判斷,即進(jìn)行相應(yīng)的邏輯運(yùn)算,得到布爾型結(jié)果值并輸出。程序清單如下:
publicclassLeapJudge
{
publicstaticvoidmain(String[]args)
{
intyear=2008;
booleanleap=false;
leap=(year%400==0)||(year%100!=0)&&(year%4==0);
System.out.println(year+"isaleapyear:"+leap);
}
}
程序運(yùn)行結(jié)果如圖2-25所示。圖2-25LeapJudge.java的執(zhí)行結(jié)果2.5.2分支結(jié)構(gòu)
1.結(jié)構(gòu)說明
程序中有些語句的執(zhí)行是有條件的。當(dāng)某條件成立時(shí),執(zhí)行一段程序;該條件不成立時(shí),執(zhí)行另一段程序,或不執(zhí)行,這種情況稱為“二路分支結(jié)構(gòu)”,如圖2-26所示。在此結(jié)構(gòu)中有一個(gè)菱形的判斷框,它有兩個(gè)分支,根據(jù)條件<布爾表達(dá)式>是否成立(true/false)而分別執(zhí)行<語句A>或<語句B>。除此之外還有多路分支結(jié)構(gòu),將在switch控制語句中講解。圖2-26二路分支結(jié)構(gòu)示意圖
2.if-else語句
if-else語句是控制程序流程的最基本的形式,其中的else是可選的,所以可按下述兩種形式來使用if:
if(Boolean-expression)
statement
或
if(Boolean-expression)
statement
else
statement
其中:if和else是關(guān)鍵字;Boolean-expression是條件表達(dá)式,它必須產(chǎn)生一個(gè)布爾結(jié)果;statement指用分號結(jié)尾的簡單語句或者封閉在花括號內(nèi)的一組簡單語句即復(fù)合語句。
【例2-19】對給定的兩個(gè)數(shù)按照升序顯示。
publicclassSortTwo{
publicstaticvoidmain(String[]args){
intx=23,y=11;
if(x>y){
//借助變量z,x與y互換位置使其有序intz=x;
x=y;
y=z;
}
System.out.println("Thenumberinsortedorderare:"+x+""+y);
}
}
程序運(yùn)行結(jié)果如圖2-27所示。圖2-27SortTwo.java的執(zhí)行結(jié)果在這個(gè)程序中,當(dāng)條件表達(dá)式(x>y)的值為true時(shí),執(zhí)行了一條復(fù)合語句。復(fù)合語句完成了x和y的互換。初學(xué)者在這里容易犯一個(gè)錯(cuò)誤,會(huì)寫成下面的形式:
if(x>y)
//借助變量z,x與y互換位置使其有序
intz=x;
x=y;
y=z;
System.out.println("Thenumberinsortedorderare:"+x+""+y);缺少了{(lán)},系統(tǒng)會(huì)認(rèn)為,當(dāng)條件表達(dá)式(x>y)的值為true時(shí),執(zhí)行一條語句“intz=x;”,而其他部分被看做是if語句執(zhí)行完后要順次執(zhí)行的語句,與if條件成立時(shí)的執(zhí)行行為無關(guān)。因此在編寫程序時(shí),一定要注意執(zhí)行語句的完整性,恰當(dāng)?shù)厥褂脅}。
同時(shí)在編寫程序的時(shí)候要注意縮進(jìn)和括號的位置。將與if語句關(guān)聯(lián)的Action語句縮進(jìn),可以給讀者一個(gè)提示:Action語句的執(zhí)行依賴if語句表達(dá)式。一致的縮進(jìn)有助于提高程序的可讀性,多數(shù)程序員通常每層縮進(jìn)三到四個(gè)空格。所以if語句要寫成下面的形式:
if(x>y){//if語句首行:包含了{(lán),以節(jié)省行空間
intz=x;//比首行縮進(jìn)了四個(gè)空格
x=y;
y=z;
}
//結(jié)束括號放在單獨(dú)行,縮進(jìn)層次與相關(guān)的if語句相同,直觀地表
//示程序中隨后的語句與該if語句是不相關(guān)的
【例2-20】對給定的兩個(gè)數(shù),求出最大值并顯示。
publicclassMaximum{
publicstaticvoidmain(String[]args){
intx=35,y=11;
intmaximum;
if(x>y){ //x大嗎
maximum=x; //x大:maximum得到x的值}
else{ //x<=y嗎
maximum=y; //x<=y:maximum得到y(tǒng)的值
}
System.out.println("Themaximumof"+x+"and"+y+"is:"+maximum);
}
}
程序運(yùn)行結(jié)果如圖2-28所示。圖2-28Maximum.java的執(zhí)行結(jié)果在這個(gè)程序中,有以下幾點(diǎn)說明:
(1)?if和else具有相同的縮進(jìn)層次,直觀地表明它們是一個(gè)整體。
(2)某個(gè)條件滿足時(shí)要執(zhí)行語句體,一定要用{}括起來。當(dāng)只有一條執(zhí)行語句時(shí),可以省略{}。本程序沒有省略,以使表達(dá)更清晰,建議初學(xué)者這樣做。
(3)?if分句和else分句之間不能有任何“非法”語句出現(xiàn),否則破壞了if-else的完整性,編譯系統(tǒng)會(huì)給出錯(cuò)誤提示。如下面的語句:
if(value2==value1){
System.out.println(“Theyareequal!);
}
temp=value1;//“割斷”了if和els
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 自學(xué)美術(shù)系統(tǒng)化課程設(shè)計(jì)
- 北京師范大學(xué)珠海分?!督鹑趯?shí)證的計(jì)量經(jīng)濟(jì)學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025版酒店室內(nèi)外景觀工程施工合作協(xié)議3篇
- 七年級音樂教學(xué)總結(jié)3篇
- 電子課程設(shè)計(jì) 溫度采集
- 學(xué)燙染技術(shù)課程設(shè)計(jì)
- 二零二五年口腔科醫(yī)療資源整合及共享協(xié)議2篇
- 銀行個(gè)人實(shí)習(xí)總結(jié)2022模板6篇
- 北京師范大學(xué)《平面設(shè)計(jì)研發(fā)與制作二》2023-2024學(xué)年第一學(xué)期期末試卷
- 二零二五年大氣污染防治工程驗(yàn)收監(jiān)測合同3篇
- 2024年教師師德師風(fēng)工作計(jì)劃(2篇)
- 物流行業(yè)服務(wù)質(zhì)量保障制度
- 養(yǎng)老院物資采購流程及制度
- 眼鏡店年終總結(jié)及計(jì)劃
- 一年級新生家長會(huì)課件(共25張課件)
- 廣東省東華高級中學(xué)2025屆高一上數(shù)學(xué)期末考試試題含解析
- GB/T 22081-2024網(wǎng)絡(luò)安全技術(shù)信息安全控制
- 2024-2025學(xué)年上海市閔行區(qū)華東師大二附中九年級(上)月考數(shù)學(xué)試卷(10月份)(含解析)
- 心理健康教育(共35張課件)
- 2024年時(shí)事新聞及點(diǎn)評【六篇】
- GB/T 44271-2024信息技術(shù)云計(jì)算邊緣云通用技術(shù)要求
評論
0/150
提交評論