1.&和&&
&和&&都可以用作邏輯與的運算符,表示邏輯與(and),當運算符兩邊的表達式的結果都爲true時,整個運算結果才爲true,否則,只要有一方爲false,則結果爲false。
&&還具有短路的功能,即如果第一個表達式爲false,則不再計算第二個表達式,例如,對於if(str != null && !str.equals(“”))表達式,當str爲null時,後面的表達式不會執行,所以不會出現NullPointerException如果將&&改爲&,則會拋出NullPointerException異常。If(x==33 & ++y>0) y會增長,If(x==33 && ++y>0)不會增長
&還可以用作位運算符,當&操作符兩邊的表達式不是boolean類型時,&表示按位與操作,我們通常使用0x0f來與一個整數進行&運算,來獲取該整數的最低4個bit位,例如,0x31 & 0x0f的結果爲0x01。
舉例:
for(int i=0;i<n;++i) {
while(p2<n&&b[i]>=c[p2])//while(b[i]>=c[p2]&&p2<n)
p2++;
dp[i]=n-p2;
// sdp[i]=(i==0?0:sdp[i-1])+dp[i];//Sn=Sn-1 +an;
System.out.println(dp[i]);
}
假如是while(b[i]>=c[p2]&&p2<n),有可能到最後p2自加到n,此時再進行一次while循環的判斷,就會先執行b[i]>=c[p2],因爲我c數組只開了n個大小,此時p2=n,c數組就越界了,報錯。
但是如果我是while(p2<n&&b[i]>=c[p2]),相同情況下,會先執行p2<n,表達式是false,則不再計算第二個表達式,自然不會報數組越界的錯誤!
2. 交換兩個數a,b
舉例:
int a=2,b=3;
for(int i=0;i<123456;++i) {
/*a=2*a-3*b;
b=3*a+2*b;error*/
int temp=2*a-3*b;
b=3*a+2*b;
a=temp;//別忘了右部也有a,會被影響的
}