JAVA 运算符和表达式Mark
?
算?符?指?明?对?操?作?数?所?进?行?的?运?算?。?按?操?作?数?的?数?目?来?分?,可?以?有?一?元?运?算?符?(如?++、
-),二?元?运?算?符?(如?+、?>)和?三?元?运?算?符?(如??:),它?们?分?别?对?应?于?一?个?、?两?个?和?三?个?操?作?数?。?对
于?一?元?运?算?符?来?说?,可?以?有?前?缀?表?达?式?(如?++i?)和?后?缀?表?达?式?(如?i++),对?于?二?元?运?算?符?来?说?则
采?用?中?缀?表?达?式?(如?a+b)。?按?照?运?算?符?功?能?来?分?,基?本?的?运?算?符?有?下?面?几?类?:
1.算?术?运?算?符?(+,-,*,/,%,++,--)
2.关?系?运?算?符?(>,<,>=,<=,==,!=)
3.布?尔?逻?辑?运?算?符?(!,&&,||)
4.位?运?算?符?(>>,<<,>>>,&,|,^,~?)
5.赋?值?运?算?符?(=,及?其?扩?展?赋?值?运?算?符?如?+=)
6.条?件?运?算?符?(??:)
7.其?它?(包?括?分?量?运?算?符?·?,下?标?运?算?符?[],实?例?运?算?符?instanc?eof,内?存?分?配?运?算?符?new,强?制?类
型?转?换?运?算?符?(类?型?),方?法?调?用?运?算?符?()?等?)
本?章?中?我?们?主?要?讲?述?前?6类?运?算?符?。
§?3.1算?术?运?算?符
算?术?运?算?符?作?用?于?整?型?或?浮?点?型?数?据?,完?成?算?术?运?算?。
一?、?二?元?算?术?运?算?符?,如?下?表?所?示
运算符?用法?描述
+?op1+op2?加
-?op1-op2?减
*?op1*op2?乘
/?op1/op2?除
%?op1%op2?取模(求余)
Java对?加?运?算?符?进?行?了?扩?展?,使?它?能?够?进?行?字?符?串?的?连?接?,如?"abc"+"de",得?到?串?"abcde"。?我
们?将?在?第?七?章?中?讲?解?。
与?C、?C++不?同?,对?取?模?运?算?符?%来?说?,其?操?作?数?可?以?为?浮?点?数?,?如?37.2%10=7.2。
二?、?一?元?算?术?运?算?符?,如?下?表?所?示?:
运算符?用法?描述
+?+op?正值
-?-op?负值
++?++op,op++?加1
--?--op,op--?减1
i++与?++i的?区?别
i++在?使?用?i之?后?,使?i的?值?加?1,因?此?执?行?完?i++后?,整?个?表?达?式?的?值?为?i,而?i的?值?变?为?i+1。
++i在?使?用?i之?前?,使?i的?值?加?1,因?此?执?行?完?++i后?,整?个?表?达?式?和?i的?值?均?为?i+1。
对?i--与?--i同?样?。
例?3.1.下?面?的?例?子?说?明?了?算?术?运?算?符?的?使?用
public?class?ArithmaticOp{
public?static?void?main(?String?args[]?){
int?a=5+4;?//a=9
int?b=a*2;?//b=18
int?c=b/4;?//c=4
int?d=b-c;?//d=14
int?e=-d;?//e=-14
int?f=e%4;?//f=-2
double?g=18.4;
double?h=g%4;?//h=2.4
int?i=3;
int?j=i++;?//i=4,j=3
int?k=++i;?//i=5,k=5
System.out.println("a?=?"+a);
System.out.println("b?=?"+b);
System.out.println("c?=?"+c);
System.out.println("d?=?"+d);
System.out.println("e?=?"+e);
System.out.println("f?=?"+f);
System.out.println("g?=?"+g);
System.out.println("h?=?"+h);
System.out.println("i?=?"+i);
System.out.println("j?=?"+j);
System.out.println("k?=?"+k);
}
}
其结果为:
C:\>java?ArithmaticOp
a?=?9
b?=?18
c?=?4
d?=?14
e?=?-14
f?=?-2
g?=?18.4
h?=?2.4
i?=?5
j?=?3
k?=?5
§?3.2关?系?运?算?符
关?系?运?算?符?用?来?比?较?两?个?值?,返?回?布?尔?类?型?的?值?true或?false。?关?系?运?算?符?都?是?二?元?运?算
符?,如?下?表?所?示?:
运算符?用法?返回true的情况
>?op1>op2?op1大于op2
>+?op1>=op2?op1大于或等于op2
<?op1<op2?op1小于op2
<=?op1<=op2?op1小于或等于op2
==?op1==op2?op1与op2相等
!=?op1!=op2?op1与op2不等
Java中?,任?何?数?据?类?型?的?数?据?(包?括?基?本?类?型?和?组?合?类?型?)都?可?以?通?过?==或?!=来?比?较?是?否
相?等?(这?与?C、?C++不?同?)。
关?系?运?算?的?结?果?返?回?true或?false,而?不?是?C、?C++中?的?1或?0。
关?系?运?算?符?常?与?布?尔?逻?辑?运?算?符?一?起?使?用?,作?为?流?控?制?语?句?的?判?断?条?件?。?如
if(?a>b?&&?b==c)
§?3.3布?尔?逻?辑?运?算?符
布?尔?逻?辑?运?算?符?进?行?布?尔?逻?辑?运?算?,如?下?表?所?示?:
op1?op2?op1&&op2?op1||op2?!op1
false?false?false?false?true
false?true?false?true?true
true?false?false?true?false
true?true?true?true?false
}@@@
·&&、‖ 为二元运算符,实现逻辑与、逻辑或。
·!?为一元运算符,实现逻辑非。
·对于布尔逻辑运算,先求出运算符左边的表达式的值,对或运算如果为true,则整个表
达式的结果为true,不必对运算符右边的表达式再进行运算;同样,对与运算,如果左边表达式
的值为false,则不必对右边的表达式求值,整个表达式的结果为false。
下面的例子说明了关系运算符和布尔逻辑运算符的使用。
@@@[
public?class?RelationAndConditionOp{
public?static?void?main(?String?args[]?){
int?a=25,b=3;
boolean?d=a<b;?//d=false
System.out.println("a<b?=?"+d);
int?e=3;
if(e!=0?&&?a/e>5)
System.out.println("a/e?=?"+a/e);
int?f=0;
if(f!=0?&&?a/f>5)
System.out.println("a/f?=?"+a/f);
else
System.out.println("f?=?"+f);
}
}
其运行结果为:
C:\>java?RelationAndConditionOp
a<b?=?false
a/e?=?8
f?=?0
注?意?:上?例?中?,第?二?个?if语?句?在?运?行?时?不?会?发?生?除?0溢?出?的?错?误?,因?为?e!=0为?false,所?以?就?不?需
要?对?a/e进?行?运?算?。
§?3.4位?运?算?符
位?运?算?符?用?来?对?二?进?制?位?进?行?操?作?,Java中?提?供?了?如?下?表?所?示?的?位?运?算?符?:
位?运?算?符?中?,除? ?~? ?以?外?,其?余?均?为?二?元?运?算?符?。
操?作?数?只?能?为?整?型?和?字?符?型?数?据?。
3.4.1补?码
Java使?用?补?码?来?表?示?二?进?制?数?,在?补?码?表?示?中?,最?高?位?为?符?号?位?,正?数?的?符?号?位?为?0,负?数
为?1。?补?码?的?规?定?如?下?:
对?正?数?来?说?,最?高?位?为?0,其?余?各?位?代?表?数?值?本?身?(以?二?进?制?表?示?),如?+42的?补?码?为
00101010。
对?负?数?而?言?,把?该?数?绝?对?值?的?补?码?按?位?取?反?,然?后?对?整?个?数?加?1,即?得?该?数?的?补?码?。?如
-42的?补?码?为?11010110?(00101010?按?位?取?反?11010101?+1?11010110?)
用?补?码?来?表?示?数?,0的?补?码?是?唯?一?的?,都?为?00000000。?(而?在?原?码?,反?码?表?示?中?,+0和?-0的?表?示
是?不?唯?一?的?,可?参?见?相?应?的?书?籍?)。?而?且?可?以?用?111111表?示?-1的?补?码?(这?也?是?补?码?与?原?码?和?反
码?的?区?别?)。
3.4.2按?位?取?反?运?算?符? ?~
~? ?是?一?元?运?算?法?,对?数?据?的?每?个?二?进?制?位?取?反?,即?把?1变?为?0,把?0变?为?1。
例?如?:
0010101
~
1101010
注?意?,~?运?算?符?与?-?运?算?符?不?同?,~?21≠?-21。
3.4.3按?位?与?运?算?符?&
参?与?运?算?的?两?个?值?,如?果?两?个?相?应?位?都?为?1,则?该?位?的?结?果?为?1,否?则?为?0。?即?:
0?&?0?=?0,0?&1?=?0,1?&?0?=?0,1?&?1?=?1