第3章-運算符、表達式和語句_第1頁
第3章-運算符、表達式和語句_第2頁
第3章-運算符、表達式和語句_第3頁
第3章-運算符、表達式和語句_第4頁
第3章-運算符、表達式和語句_第5頁
已閱讀5頁,還剩47頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第3章運算符、表達式和語句

3.1運算符與表達式3.2語句概述3.3if語句3.4switch語句3.5循環(huán)語句3.6break和continue語句3.7for語句與數(shù)組3.1運算符與表達式Java提供了豐富的運算符,如算術(shù)運算符、關(guān)系運算符、邏輯運算符、位運算符等。本節(jié)將介紹大部分運算符。1.算術(shù)運算符與表達式

加減運算符:+,-,加減運算符的結(jié)合方向是從左到右。加減運算符的優(yōu)先級是4級。乘,除和求余運算符:*,/,%,運算符的結(jié)合方向是從左到右。乘除運算符的操作元是整型或浮點型數(shù)據(jù)。*,/,%(取余)運算符的優(yōu)先級是3級。用算術(shù)符號和括號連接起來的符合java語法規(guī)則的式子,稱為算術(shù)表達式,如:x+2*y-30+3*(y+5)。2.自增,自減運算符:++,--

自增、自減運算符是單目運算符,可以放在操作元之前,也可以放在操作元之后。操作元必須是一個整型或浮點型變量。作用是使變量的值增1或減1.++x(--x)表示在使用x之前,先使x的值加(減)1。x++(x--)表示在使用x之后,使x的值加(減)1。下一次粗略的看,++x和x++的作用相當于

x=x+1。但++x和x++的不同之處在于,++x是先執(zhí)行

x=x+1再使用x的值,而x++是先使用x的值再執(zhí)行x=x+1。如果x的原值是5,則:對于y=++x y的值為6,x的值也變?yōu)?。y的值為5,然后x的值變?yōu)?。對于y=x++ 3.算術(shù)混合運算的精度

精度從“低”到“高”排列的順序是:

byteshortintlongfloatdoubleJava將按運算符兩邊的操作元的最高精度保留結(jié)果的精度。例如:

5/2的結(jié)果是2,要想得到2.5,必須寫成5.0/2或5.0f/2。char型數(shù)據(jù)和整型數(shù)據(jù)運算結(jié)果的精度是int。例如:bytex=7;

那么‘B’+x;的結(jié)果應(yīng)該是int因此下列寫法是不正確的,

charch=’B’+x;

應(yīng)當寫成:charch=(char)(’B’+x);

Java在計算算術(shù)表達式的值時,使用下列計算精度規(guī)則:1.如果表達式中有雙精度浮點數(shù)(double型數(shù)據(jù)),則按雙精度進行運算。2.如果表達式中最高精度是單精度浮點數(shù)(float型數(shù)據(jù)),則按單精度進行運算。3.如果表達式中最高精度是long型整數(shù),則按long精度進行運算。4.如果表達式中最高精度低于int型整數(shù),則按int精度進行運算。精度從“低”到“高”排列的順序是:

byteshortintlongfloatdouble4.關(guān)系運算符與關(guān)系表達式關(guān)系運算符:<,>,<=,>=,!=,==關(guān)系運算符用來比較兩個值的關(guān)系。關(guān)系運算符的運算結(jié)果是boolean型,當運算符對應(yīng)的關(guān)系成立時,運算結(jié)果是true,否則是false。例如,10<9的結(jié)果是false,5>1的結(jié)果是true,注意:因為算術(shù)運算符的級別高于關(guān)系運算符,10>20-17相當于10>(20-17),結(jié)果當然是true。

3!=5的結(jié)果是10>20-17的結(jié)果為truetrue結(jié)果為數(shù)值型的變量或表達式可以通過關(guān)系運算符(如表3.1所示)形成關(guān)系表達式。如,4>8,(x+y)>80。p35運算符優(yōu)先級用法含義結(jié)合方向>6op1>op2大于左到右<6op1<op2小于左到右>=6op1>=op2大于等于左到右<=6op1<=op2小于等于左到右==7op1==op2等于左到右!=7op1!=op2不等于左到右

表3.1 關(guān)系運算符5.邏輯運算符與邏輯表達式

邏輯運算符包括:&&,||,!。表

3.2邏輯運算符運算符優(yōu)先級用法含義結(jié)合方向&&||!11122op1&&op2op1||op2!op邏輯與邏輯或

邏輯非左到右

左到右

右到左其中&&、||為雙目運算符,實現(xiàn)邏輯與、邏輯或;!為單目運算符,實現(xiàn)邏輯非。邏輯運算符的操作元必須是boolean型數(shù)據(jù),邏輯運算符可以用來連接關(guān)系表達式。結(jié)果為boolean

型的變量或表達式可以通過邏輯運算符合成為邏輯表達式。op1op2op1&&op2op1||op2!

op1truetruetruetruefalsetruefalsefalsetruefalsefalsetruefalsetruetruefalsefalsefalsefalsetrue用邏輯運算符進行邏輯運算,結(jié)果如表3.3所示。p23

表3.3 用邏輯運算符進行邏輯運算例如,2>8&&9>2的結(jié)果為false,2>8||9>2的結(jié)果為true。3!=521<25&&短路邏輯運算符6.賦值運算符與賦值表達式賦值運算符:=賦值運算符是雙目運算符,左面的操作元必須是變量,不能是常量或表達式。賦值運算符的優(yōu)先級較低,是14級,結(jié)合方向右到左。賦值表達式的值就是“=”左面變量的值。注意:不要將賦值運算符“=”與等號運算符“==”混淆。設(shè)x是一個整型變量,y是一個boolean型變量,x=20

和y=true都是正確的賦值表達式,整型數(shù)據(jù)在內(nèi)存中以二進制的形式表示,比如一個int

型的變量在內(nèi)存中占4個字節(jié)共32位,int型數(shù)據(jù)7的二進制表示是

0000000000000000

00000000000001117.位運算符左面最高位是符號位,最高位是0表示正數(shù),1表示負數(shù)。負數(shù)采用補碼表示,比如-8的補碼是

111111111111111111111111111111000這樣我們就可以對整型數(shù)據(jù)進行按位的運算,比如,對兩個整型數(shù)據(jù)對應(yīng)的位進行運算得到一個新的整型數(shù)據(jù)。(1)“按位與”運算符“&”是雙目運算符,對兩個整型數(shù)據(jù)a,b

按位進行運算,運算結(jié)果是一個整型數(shù)據(jù)c。

例如a 0000000000000000

0000000000000111b 10000001101001011111001110101011&c 0000000000000000

0000000000000011

運算法則是:如果a,b

兩個數(shù)據(jù)對應(yīng)位都是1,則c的該位是1,否則是0。如果b的精度高于a,那么結(jié)果c的精度和b相同。

(2)“按位或”運算符“|”是雙目運算符。對兩個整型數(shù)據(jù)a,b

按位進行運算,運算結(jié)果是一個整型數(shù)據(jù)c。

運算法則:是 如果a,b

兩個數(shù)據(jù)對應(yīng)位都是0,則c的該位是0,否則是1。如果b的精度高于與a,那么結(jié)果c的精度和b相同。例如a 0000000000000000

0000000000000111b 10000001101001011111001110101011|c 10000001101001011111001110101111(3)“按位非”運算符“~”是單目運算符。對一個整型數(shù)據(jù)a按位進行運算,運算結(jié)果是一個整型數(shù)據(jù)c。

運算法則:是如果a對應(yīng)位都是0,則c的該位是1否則是1。例如a 0000000000000000

0000000000000111~ab 10000001101001011111001110101011~b 1111111111111111

111111111111100001111110010110100000110001010100 ”^”是雙目運算符。對兩個整型數(shù)據(jù)a,b

按位進行運算,運算結(jié)果是一個整型數(shù)據(jù)

c。

運算法則:是如果a,b

兩個數(shù)據(jù)對應(yīng)位相同,則c的該位是

0,否則是1。如果b的精度高于與a,那么結(jié)果c的精度和b相同。由異或運算法則可知:

a^a=0,a^0=a因此,如果c=a^b,那么a=c^b,即用同一個數(shù)對數(shù)a進行兩次”異或”運算的結(jié)果又是數(shù)a。c=a^b=

a^b^b=a^0=a(4)“按位異或”運算符c^b在下面的例子1中,利用”異或”運算的性質(zhì),對幾個字符進行加密并輸出密文,然后再解密。

例子1(效果如圖3.1)classExample3_1{publicstaticvoidmain(Stringargs[]){chara1='十',a2='點',a3='進',a4='攻';charsecret='8';a1=(char)(a1^secret);a2=(char)(a2^secret);a3=(char)(a3^secret);a4=(char)(a4^secret);

System.out.println("密文:"+a1+a2+a3+a4);a1=(char)(a1^secret);a2=(char)(a2^secret);a3=(char)(a3^secret);a4=(char)(a4^secret);

System.out.println("原文:"+a1+a2+a3+a4);}}位運算符也可以操作邏輯型數(shù)據(jù),法則是:當a,b

都是true時,a&b

是true,否則a&b

是false。當a,b

都是false時,a|b

是false,否則a|b

是true。當a是true時,~a是false;當a是false時,~a是true.位運算符在操作邏輯型數(shù)據(jù)時,與邏輯運算符&&,||,!

不同的是:位運算符要計算完a和b的之后,再給出運算的結(jié)果。比如,x的初值是1,那么經(jīng)過下列邏輯比較運算后,((y=1)==0))&&((x=6)==6));x的值仍然是1,但是如果經(jīng)過下列位運算之后,((y=1)==0))&((x=6)==6));x的值將是6?!?/p>

位運算符也可以操作字符數(shù)據(jù),但運算結(jié)果是int

型數(shù)據(jù),例如:charx=’a’,y=’b’;那么x|y,x&y,x^y,~x的結(jié)果是int型。8.instanceof

運算符

該運算符是雙目運算符,左面的操作元是一個對象;右面是一個類。當左面的對象是右面的類創(chuàng)建的對象時,該運算符運算的結(jié)果是true

,否則是false。

9.運算符綜述Java的表達式就是用運算符連接起來的符合Java規(guī)則的式子。運算符的優(yōu)先級決定了表達式中運算執(zhí)行的先后順序。例如,x<y&&!z相當于(x<y)&&(!z),沒有必要去記憶運算符號的優(yōu)先級別,在編寫程序時可盡量的使用括號()運算符號來實現(xiàn)你想要的運算次序,以免產(chǎn)生難以閱讀或含糊不清的計算順序。運算符的結(jié)合性決定了并列相同級別的運算符的先后順序,例如,加減的結(jié)合性是從左到右,8-5+3相當于

(8-5)+3。再如:邏輯否運算符!的結(jié)合性是從右到左,?。相當于!(!x)。

表3.4 運算符的優(yōu)先級和結(jié)合性優(yōu)先級描述運算符結(jié)合性分隔符[]().,;

對象歸類,

自增自減運算,instanceof++--!右到左邏輯非算術(shù)乘除運算*/%左到右算術(shù)加減運算+-左到右移位運算>><<>>>左到右大小關(guān)系運算<<=>>=左到右相等關(guān)系運算==!=左到右按位與運算&左到右按位異或運算^左到右按位或運算|左到右

表3.4 運算符的優(yōu)先級和結(jié)合性優(yōu)先級描述運算符結(jié)合性邏輯與運算&&左到右邏輯或運算||左到右三目條件運算?:左到右賦值運算=右到左3.2語句概述

Java里的語句可分為以下五類:

1.方法調(diào)用語句

System.out.println(“Hello");2.表達式語句由一個表達式構(gòu)成一個語句,最典型的是賦值語句。如:x=23;

一個表達式的最后加上一個分號就構(gòu)成了一個語句。分號是語句不可缺少的部分。

3.復(fù)合語句可以用{}把一些語句括起來構(gòu)成復(fù)合語句。

{z=23+x;

System.out.println("hello");}4.空語句

;5.控制語句包括條件語句和switch開關(guān)語句。6.package語句和import語句

package語句和import語句和類,對象有關(guān),將在第4章講解。3.3if條件分支語句

Java語言的控制語句有2種類型,即條件語句,和switch開關(guān)語句。1.條件控制語句(1)if語句的一般形式:

if(表達式){若干語句

}真表達式{若干語句}假

if后面()內(nèi)的表達式的值必須是boolean

類型,當值為true時,則執(zhí)行緊跟著的復(fù)合語句;如果表達式的值為false,則執(zhí)行程序中if語句后面的其他語句。復(fù)合語句如果只有一個語句,{}可以省略不寫,但為了增強程序的可讀性最好不要省略!例2將變量a,b,c按從小到大順序排列輸出

publicclassExample3_2{publicstaticvoidmain(String

args[]){

inta=9,b=5,c=7,t;

if(a>b){t=a;a=b;b=t;}

if(a>c){t=a;a=c;c=t;}

if(b>c){t=b;b=c;c=t;}

System.out.println("a="+a+",b="+b+",c="+c);}}(2)if-else語句的一般形式:if(表達式){若干語句

}else{若干語句

}表達式{若干語句}假{若干語句}真

if后面()內(nèi)的表達式的值必須是boolean

型的。如果表達式的值為true,則執(zhí)行緊跟著的復(fù)合語句;如果表達式的值為false,則執(zhí)行else后面的復(fù)合語句。復(fù)合語句是由{}括起來的若干個語句。下列是有語法錯誤的if-else語句,if(x>0)y=10;z=20;elsey=-100;

正確的寫法是

if(x>0){y=10;z=20;}elsey=100;注:

if和else后面的復(fù)合句里如果只有一個語句,{}可以省略不寫,但為了增強程序的可讀性最好不要省略。有時為了編程的需要,else或if后面的大括號里可以沒有語句。例3.4publicclassExample3_3{publicstaticvoidmain(Stringargs[]){

intmath=65,english=85;if(math>60){System.out.println("數(shù)學(xué)及格了");}else{System.out.println("數(shù)學(xué)不及格");}

if(english>90){System.out.println("英語是優(yōu)");}else{System.out.println("英語不是優(yōu)");}

System.out.println("我在學(xué)習(xí)控制語句");

}}(3)if語句的擴充形式表達式1false表達式2false…表達式nfalse語句1語句2語句nIf(表達式1)語句1elseif(表達式2)語句2…elseif(表達式n)

語句n

if(表達式1)語句1elseif(表達式2)語句2elseif(表達式3)語句3……elseif(表達式m)語句melse語句n

if(表達式1)語句1elseif(表達式2)語句2elseif(表達式3)語句3……elseif(表達式m)語句melse語句n

if(魚香肉絲)買魚香肉絲

else

if(燒茄子)買燒茄子

else

if(燒豆角)買燒豆角

……

else

if(土豆絲)買土豆絲

else不買

if(魚香肉絲)買魚香肉絲

elseif(燒茄子)買燒茄子

elseif(燒豆角)買燒豆角

……elseif(土豆絲)買土豆絲

else不買3.4switch開關(guān)語句

switch語句是多分支的開關(guān)語句,它的一般格式定義如下(其中break語句是可選的):switch(表達式){case常量值1:

若干個語句

break;case常量值2:

若干個語句

break;...case常量值n:

若干個語句

break;default:

若干語句}

switch語句中表達式的值必須是整型或字符型,但不能是long;常量值1到常量值n必須也是整型或字符型。

switch語句首先計算表達式的值,如果表達式的值和某個case后面的常量值相同,就執(zhí)行該case里的若干個語句直到碰到break語句為止。若沒有一個常量與表達式的值相同,則執(zhí)行default后面的若干個語句。其中default是可有可無的,如果它不存在,并且所有的常量值都和表達式的值不相同,那么switch語句就不會進行任何處理。注意!在同一個switch語句中,case后的常量值必須互不相同。例4importjava.util.Scanner;publicclassExample3_4{publicstaticvoidmain(String

args[]){

intnumber;

System.out.println("輸入正整數(shù)(回車確定)");Scannerreader=newScanner(System.in); number=reader.nextInt();

switch(number){ case9: case131: case12:System.out.println(number+"是三等獎"); break; case209: case596: case27:System.out.println(number+"是二等獎"); break; case875: case316: case59:System.out.println(number+"是一等獎"); break; default:System.out.println(number+"未中獎");}}}3.5循環(huán)語句

1.for循環(huán)語句for語句是java程序設(shè)計中最有用的循環(huán)語句之一,for語句的格式如下:for(表達式1;表達式2;表達式3){若干語句

}

for語句中的復(fù)合語句{若干語句},稱為循環(huán)體。表達式1負責完成變量的初始化。表達式式2是值為

boolean型的表達式,稱為循環(huán)條件。表達式3用來修整變量,改變循環(huán)條件。for語句的執(zhí)行過程是這樣的:

首先計算表達式1,完成必要的初始化工作;再判斷表達式2的值,若表達式2的值為true,則執(zhí)行循環(huán)體;執(zhí)行完循環(huán)體之后緊接著計算表達式3,以便改變循環(huán)條件,這樣一輪循環(huán)就結(jié)束了。

第二輪循環(huán)從計算表達式2開始,若表達式2的值仍為true,則繼續(xù)循環(huán),否則跳出整個for語句執(zhí)行后面的語句,如圖3.6所示。for(表達式1;表達式2;表達式3){若干語句

}表達式1表達式2循環(huán)體表達式3for(表達式1;表達式2;表達式3){若干語句

}truefalse例5計算8+88+888+8888……的前12項和

publicclassExample3_5{publicstaticvoidmain(String

args[]){longsum=0,a=8,item=a,n=12,i=1;

for(i=1;i<=n;i++){sum=sum+item;item=item*10+a;}

System.out.println(sum);}}2.while循環(huán)一般格式:

while(表達式){

若干語句

}3.do-while循環(huán)一般格式:

do{

若干語句

}while(表達式);當{}中只有一條語句時,大括號{}可以省略,但最好不要省略,以便增加程序的可讀性。注

do-while循環(huán)和while循環(huán)的區(qū)別是 do-while的循環(huán)體至少被執(zhí)行一次。表達式{若干語句}假真While循環(huán)語句表達式{若干語句}假真do-While循環(huán)語句例6用while語句計算1+1/2!+1/3!+1/4!…的前20項

publicclassExample3_6{publicstaticvoidmain(String

args[]){doublesum=0,item=1;

inti=1,n=20;

while(i<=n){sum=sum+item;i=i+1;item=item*(1.0/i);}

System.out.println("sum="+sum);}}3.6break和continue語句

break和continue語句是指用關(guān)鍵字break或continue加上分號構(gòu)成的語句,例如:

break;在循環(huán)體中可以使用break語句和continue語句。在一個循環(huán)中,比如循環(huán)50次的循環(huán)語句中,如果在某次循環(huán)中執(zhí)行了break語句,那么整個循環(huán)語句就結(jié)束。如果在某次循環(huán)中執(zhí)行了continue語句,那么本次循環(huán)就結(jié)束,即不再執(zhí)行本次循環(huán)中循環(huán)體中continue語句后面的語句,而轉(zhuǎn)入進行下一次循環(huán)。

真表達式1語句1表達式2語句2While循環(huán)語句假continue真假break例7publicclassExample3_7{publicstaticvoidmain(Stringargs[]){

intsum=0,i,j;for(i=1;i<=10;i++){if(i%2==0)//計算1+3+5+7+9continue;sum=sum+i;}

System.out.println("sum="+sum);for(j=2;j<=100;j++)//求50以內(nèi)的素數(shù)

{for(i=2;i<=j/2;i++){if(j%i==0)break;}if(i>j/2){System.out.println(""+j+"是素數(shù)");}}}}3.7for語句與數(shù)組

JDK1.5后,對for語句的功能給予擴充、增強,以便更好地遍歷數(shù)組。語法格式如下:for(聲明循環(huán)變量:數(shù)組的名字){…}其中,聲明的循環(huán)變量的類型必須和數(shù)組的類型相同。這種形式的for語句類似自然語言中的“foreach”語句,為了便于理解上述for語句,可以將這種形式的for語句中翻譯成“對于循環(huán)變量依次取數(shù)組的每一個元素的值”。

例子8分別使用for語句的傳統(tǒng)方式和改進方式遍歷數(shù)組。

publicclassExample3_8{publicstaticvoidmain(Stringargs[]){

inta[]={1,2,3,4};charb[]={'a','b','c','d'};

for(intn=0;n<a.length;n++){//傳統(tǒng)方式

System.out.println(a[n]);}

for(intn=0;n<b.length;n++){//傳統(tǒng)方式

System.out.println(b[n]);}

for(int

i:a){//循環(huán)變量i依次取數(shù)組a的每一個元素的值(改進方式)

System.out.println(i);}for(charch:b){//循環(huán)變量ch依次取數(shù)組b的每一個元素的值(改進方式)

System.out.println(ch);}}}3.8應(yīng)用舉例

前面講過:可以使用Scanner類創(chuàng)建一個對象:

Scannerreader=newScanner(System.in);◆reader對象調(diào)用下列方法,讀取用戶在命令行(例如,MS-DOS窗口)輸入的各種基本類型數(shù)據(jù):

nextBoolean()、nextByte()、nextShort()、nextInt()

nextLong()、nextFloat()、nextDouble()。

◆上述方法執(zhí)行時都會堵塞,程序等待用戶在命令行輸入數(shù)據(jù)回車確認。上述方法執(zhí)行時都會阻塞,

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論