1:優(yōu)先級(jí)
優(yōu)先級(jí)是指同一式子中多個(gè)運(yùn)算符被執(zhí)行和次序,同一級(jí)里的操作符具有相同的優(yōu)先級(jí),相同優(yōu)先級(jí)得操作符號(hào)相遇是,根據(jù)結(jié)合性決定運(yùn)算次序,下面從高到低的優(yōu)先級(jí)列出了運(yùn)算符。同一行中的運(yùn)算符優(yōu)先級(jí)相同。
. [] () 結(jié)合性從左到右
++ -- ! ~ 結(jié)合性從左到右
* / % 結(jié)合性從左到右
+ - 結(jié)合性從左到右
<< >> >>> 結(jié)合性從左到右
< > <= >= 結(jié)合性從左到右
== != 結(jié)合性從左到右
& 結(jié)合性從左到右
^ 結(jié)合性從左到右
&& 結(jié)合性從左到右
|| 結(jié)合性從左到右
?: 結(jié)合性從右到左
= 結(jié)合性從右到左
例如對(duì)于表達(dá)式:a=b+c*d/(c^d),因?yàn)槔ㄌ?hào)優(yōu)先級(jí),所以先計(jì)算c^d,接著是c*d,然后除以c^d,最后,把上述結(jié)果與b的和存儲(chǔ)到變量a中。
2:整型運(yùn)算符
整型運(yùn)算符按操作數(shù)的多少可分為一元和二元兩類,一元運(yùn)算符一次對(duì)一個(gè)變量進(jìn)行操作,二元運(yùn)算符一次對(duì)兩個(gè)變量進(jìn)行操作。對(duì)于運(yùn)算來說,如果有一個(gè)變量或操作數(shù)是長(zhǎng)整型的,那么結(jié)果就肯定是長(zhǎng)整型的,否則即使操作數(shù)還沒有確定是字節(jié)型、短整型或字符型,運(yùn)算結(jié)果都是整型,下表是一元運(yùn)算符。
運(yùn)算符 實(shí)際操作 例子
- 改變整型數(shù)符號(hào) -i
~ 位運(yùn)算:非 ~i
++ 加1 i++
-- 減1 i--
注:一元取反運(yùn)算符(-)用來改變整數(shù)的正負(fù)號(hào),逐位求反把所變量所有是1的位變成0,是0的位變成1,加加和減減(++,--)把變量的值加1或減1。
以下是一個(gè)具體例子:
int i=0;
int j=1;
for (i=1;i<10;i++)
{
j--;
System.out.println(i+""+j+"");
}
一元運(yùn)算符執(zhí)行的方式是改變它們所作用的變量的值,對(duì)一元取反和逐位求反來說,變量的值并不改變,而對(duì)加和減運(yùn)算(++,--)來說,就量的值被改變了,例如:
int i=10,j=10,k=10,l=10;
System.out.println(i+""+j+""+k+""+l+"");
j++;
i--;
~k;
-l;
System.out.println(i+""+j+""+k+""+l+"");
注意:j和i被改變并打印出它們的新值,可是k和l仍然為原來的數(shù)值,當(dāng)在復(fù)合表達(dá)式中使用一元取反和逐位求余運(yùn)算時(shí),你實(shí)際上是在用一個(gè)臨時(shí)存貯操作數(shù)的新值。
++和--既是前置運(yùn)算符也是后置運(yùn)算符,這就是說,它們既可以放在操作數(shù)前面(++x),也可以放在后面(x++),如果它們被用在復(fù)合語句中如:
i=x++; 或 i=++x;
那么第一個(gè)語句中x把值賦給i以后再加1,而第二個(gè)語句先把x加1,再把新的x值賦給i。
整型運(yùn)算符的第二種類型是二元運(yùn)算符,這種運(yùn)算并不改變操作數(shù)的值,而是返回一個(gè)必須賦給變量的值,下表列出了二元運(yùn)算符。
運(yùn)算符 實(shí)際操作 例子
+ 加運(yùn)算 a+b
- 減運(yùn)算 a-b
* 乘運(yùn)算 a*b
/ 除運(yùn)算 a/b
% 取模運(yùn)算 a%b
& 與運(yùn)算 a&b
| 或運(yùn)算 a|b
^ 異或運(yùn)算 a^b
<< 左移 a< >> 右移 a>>b
>>> 右移 a>>>b
注意:>>與>>>的基本功能都是右移,但>>是用符號(hào)位來填充右移后所留下的空位,而>>>則是用零來填充右移后所留下的空位。
還有一類運(yùn)算,它們形如:j-=i,這里-=是二元運(yùn)算-和賦值運(yùn)算=的復(fù)合運(yùn)算,它等價(jià)于j=j-i,這種復(fù)合方式適用于所有的二元運(yùn)算符。
這里有幾點(diǎn)關(guān)于整型運(yùn)算進(jìn)一步說明,首先,整數(shù)除法向靠近0的方向取整;其次,如果你除以0或者對(duì)0取模,程序就會(huì)在運(yùn)行時(shí)被強(qiáng)行中止,如果你的運(yùn)算結(jié)果超出最小極限,或者說是下溢,結(jié)果將為0,如果超出了極限,就將會(huì)導(dǎo)致結(jié)果的回繞。
3:布爾運(yùn)算符
另外還有一些運(yùn)算符能產(chǎn)生布爾類型的結(jié)果,我們把它們稱為布爾運(yùn)算符,下表列出了這些運(yùn)算符。
運(yùn)算符 實(shí)際操作 例子
< 小于 a> 大于 a>b
<= 小于等于 a<=b
> 大于等于 a>=b
== 等于 a==b
!= 不等于 a!=b
在這里要指出的是相等運(yùn)算符==可能會(huì)給你帶來許多麻煩,很多人在比較兩個(gè)值時(shí)往往錯(cuò)用了等號(hào)=,以致于變成了賦值操作,所以在編程中一定要注意你在比較數(shù)值時(shí)用的是==。布爾類型本身還有幾個(gè)邏輯運(yùn)算符,它們可以對(duì)布爾類型的數(shù)據(jù)進(jìn)行運(yùn)算:!,&&,//
其實(shí)如果你把布爾類型的值true等效地看成1,false看成0,那么對(duì)于相同的運(yùn)算符,整型運(yùn)算的法則對(duì)布爾類型也是適用的。
布爾運(yùn)算符中還有一種三元運(yùn)算符,它的格式如下:
Operand ? Statement1:Statement2
在這個(gè)式子中,先計(jì)算Operand的真假,若為真,則執(zhí)行Statement1,若為假,則執(zhí)行Statement2。下面的代碼給出了這種運(yùn)算的一個(gè)例子:
(a>b)?a:b;
優(yōu)先級(jí)是指同一式子中多個(gè)運(yùn)算符被執(zhí)行和次序,同一級(jí)里的操作符具有相同的優(yōu)先級(jí),相同優(yōu)先級(jí)得操作符號(hào)相遇是,根據(jù)結(jié)合性決定運(yùn)算次序,下面從高到低的優(yōu)先級(jí)列出了運(yùn)算符。同一行中的運(yùn)算符優(yōu)先級(jí)相同。
. [] () 結(jié)合性從左到右
++ -- ! ~ 結(jié)合性從左到右
* / % 結(jié)合性從左到右
+ - 結(jié)合性從左到右
<< >> >>> 結(jié)合性從左到右
< > <= >= 結(jié)合性從左到右
== != 結(jié)合性從左到右
& 結(jié)合性從左到右
^ 結(jié)合性從左到右
&& 結(jié)合性從左到右
|| 結(jié)合性從左到右
?: 結(jié)合性從右到左
= 結(jié)合性從右到左
例如對(duì)于表達(dá)式:a=b+c*d/(c^d),因?yàn)槔ㄌ?hào)優(yōu)先級(jí),所以先計(jì)算c^d,接著是c*d,然后除以c^d,最后,把上述結(jié)果與b的和存儲(chǔ)到變量a中。
2:整型運(yùn)算符
整型運(yùn)算符按操作數(shù)的多少可分為一元和二元兩類,一元運(yùn)算符一次對(duì)一個(gè)變量進(jìn)行操作,二元運(yùn)算符一次對(duì)兩個(gè)變量進(jìn)行操作。對(duì)于運(yùn)算來說,如果有一個(gè)變量或操作數(shù)是長(zhǎng)整型的,那么結(jié)果就肯定是長(zhǎng)整型的,否則即使操作數(shù)還沒有確定是字節(jié)型、短整型或字符型,運(yùn)算結(jié)果都是整型,下表是一元運(yùn)算符。
運(yùn)算符 實(shí)際操作 例子
- 改變整型數(shù)符號(hào) -i
~ 位運(yùn)算:非 ~i
++ 加1 i++
-- 減1 i--
注:一元取反運(yùn)算符(-)用來改變整數(shù)的正負(fù)號(hào),逐位求反把所變量所有是1的位變成0,是0的位變成1,加加和減減(++,--)把變量的值加1或減1。
以下是一個(gè)具體例子:
int i=0;
int j=1;
for (i=1;i<10;i++)
{
j--;
System.out.println(i+""+j+"");
}
一元運(yùn)算符執(zhí)行的方式是改變它們所作用的變量的值,對(duì)一元取反和逐位求反來說,變量的值并不改變,而對(duì)加和減運(yùn)算(++,--)來說,就量的值被改變了,例如:
int i=10,j=10,k=10,l=10;
System.out.println(i+""+j+""+k+""+l+"");
j++;
i--;
~k;
-l;
System.out.println(i+""+j+""+k+""+l+"");
注意:j和i被改變并打印出它們的新值,可是k和l仍然為原來的數(shù)值,當(dāng)在復(fù)合表達(dá)式中使用一元取反和逐位求余運(yùn)算時(shí),你實(shí)際上是在用一個(gè)臨時(shí)存貯操作數(shù)的新值。
++和--既是前置運(yùn)算符也是后置運(yùn)算符,這就是說,它們既可以放在操作數(shù)前面(++x),也可以放在后面(x++),如果它們被用在復(fù)合語句中如:
i=x++; 或 i=++x;
那么第一個(gè)語句中x把值賦給i以后再加1,而第二個(gè)語句先把x加1,再把新的x值賦給i。
整型運(yùn)算符的第二種類型是二元運(yùn)算符,這種運(yùn)算并不改變操作數(shù)的值,而是返回一個(gè)必須賦給變量的值,下表列出了二元運(yùn)算符。
運(yùn)算符 實(shí)際操作 例子
+ 加運(yùn)算 a+b
- 減運(yùn)算 a-b
* 乘運(yùn)算 a*b
/ 除運(yùn)算 a/b
% 取模運(yùn)算 a%b
& 與運(yùn)算 a&b
| 或運(yùn)算 a|b
^ 異或運(yùn)算 a^b
<< 左移 a< >> 右移 a>>b
>>> 右移 a>>>b
注意:>>與>>>的基本功能都是右移,但>>是用符號(hào)位來填充右移后所留下的空位,而>>>則是用零來填充右移后所留下的空位。
還有一類運(yùn)算,它們形如:j-=i,這里-=是二元運(yùn)算-和賦值運(yùn)算=的復(fù)合運(yùn)算,它等價(jià)于j=j-i,這種復(fù)合方式適用于所有的二元運(yùn)算符。
這里有幾點(diǎn)關(guān)于整型運(yùn)算進(jìn)一步說明,首先,整數(shù)除法向靠近0的方向取整;其次,如果你除以0或者對(duì)0取模,程序就會(huì)在運(yùn)行時(shí)被強(qiáng)行中止,如果你的運(yùn)算結(jié)果超出最小極限,或者說是下溢,結(jié)果將為0,如果超出了極限,就將會(huì)導(dǎo)致結(jié)果的回繞。
3:布爾運(yùn)算符
另外還有一些運(yùn)算符能產(chǎn)生布爾類型的結(jié)果,我們把它們稱為布爾運(yùn)算符,下表列出了這些運(yùn)算符。
運(yùn)算符 實(shí)際操作 例子
< 小于 a> 大于 a>b
<= 小于等于 a<=b
> 大于等于 a>=b
== 等于 a==b
!= 不等于 a!=b
在這里要指出的是相等運(yùn)算符==可能會(huì)給你帶來許多麻煩,很多人在比較兩個(gè)值時(shí)往往錯(cuò)用了等號(hào)=,以致于變成了賦值操作,所以在編程中一定要注意你在比較數(shù)值時(shí)用的是==。布爾類型本身還有幾個(gè)邏輯運(yùn)算符,它們可以對(duì)布爾類型的數(shù)據(jù)進(jìn)行運(yùn)算:!,&&,//
其實(shí)如果你把布爾類型的值true等效地看成1,false看成0,那么對(duì)于相同的運(yùn)算符,整型運(yùn)算的法則對(duì)布爾類型也是適用的。
布爾運(yùn)算符中還有一種三元運(yùn)算符,它的格式如下:
Operand ? Statement1:Statement2
在這個(gè)式子中,先計(jì)算Operand的真假,若為真,則執(zhí)行Statement1,若為假,則執(zhí)行Statement2。下面的代碼給出了這種運(yùn)算的一個(gè)例子:
(a>b)?a:b;