更新時間:2020-10-13 17:18:57 來源:動力節(jié)點 瀏覽1192次
Java中的算術(shù)操作主要通過算術(shù)運算符來實現(xiàn),算術(shù)運算符包括一元算術(shù)運算符和二元算術(shù)運算符兩種。下面就通過大量實例一一為大家介紹這兩種算術(shù)運算符的用法。
一、一元算術(shù)運算符
一元算術(shù)運算符用于一個單獨的操作數(shù),并產(chǎn)生一個新值。在Java中,一元運算符具有很高的優(yōu)先級,而且都是右結(jié)合(right-associative)
一元算術(shù)運算符包括一元加法(+)、一元減法(-)、遞增(++)和遞減(--)
1.一元加(+)
一元加運算符以一個加號(+)表示,放在數(shù)值前面,對數(shù)值不會產(chǎn)生任何影響
var num = 25;
num = +num; //25
在對非數(shù)值應(yīng)用一元加運算符時,會調(diào)用Number()轉(zhuǎn)型函數(shù)對這個值進行轉(zhuǎn)換
var s1 = '01';
var s2 = '1.1';
var s3 = 'z';
var b = false;
var f = 1.1;
var o = {
valueOf:function(){
return -1;
}
};
s1 = +s1;//1
s2 = +s2;//1.1
s3 = +s3;//NaN
b = +b;//0
f = +f;//1.1
o = +o;//-1
在new Date()前面使用一元加符號,可以把日期字符串,轉(zhuǎn)換為日期毫秒數(shù)
console.log(new Date());//on Jul 11 2016 20:25:54 GMT+0800 (中國標(biāo)準(zhǔn)時間)
console.log(+new Date());//1468239954076
2.一元減(-)
一元減運算符主要用于表示負數(shù)
var num = 25;
num = -num;//-25
當(dāng)一元減運算符用于非數(shù)值時,會對該值使用Number()轉(zhuǎn)型函數(shù)進行轉(zhuǎn)換,再將得到的數(shù)值轉(zhuǎn)換成負數(shù)
var s1 = '01';
var s2 = '1.1';
var s3 = 'z';
var b = false;
var f = 1.1;
var o = {
valueOf:function(){
return -1;
}
};
s1 = -s1;//-1
s2 = -s2;//-1.1
s3 = -s3;//NaN
b = -b;//0
f = -f;//-1.1
o = -o;//1
一元加和一元減運算符主要用于基本的算術(shù)運算,也可以用于轉(zhuǎn)換數(shù)據(jù)類型。
3.遞增(++)
遞增++運算符對其操作數(shù)進行增量(加1)操作,操作數(shù)是一個左值(lvalue)(變量、數(shù)組元素或?qū)ο髮傩?。運算符通過Number()轉(zhuǎn)型函數(shù)將操作數(shù)轉(zhuǎn)換為數(shù)字,然后給數(shù)字加1,并將加1后的數(shù)值重新賦值給變量、數(shù)字元素或者對象屬性
var age = 29;
++age;
//相當(dāng)于
var age = 29;
age = age +1;
遞增++運算符的返回值依賴于它相對于操作數(shù)的位置。當(dāng)運算符在操作數(shù)之前,稱為前增量(pre-increment)運算符,它對操作數(shù)進行增量計算,并返回計算后的值。當(dāng)運算符在操作數(shù)之后,稱為后增量(post-increment)運算符,它對操作數(shù)進行增量計算,但返回未做增量計算的(unincremented)值
不管是前增量還是后增量,這個運算符通常用在for循環(huán)中,用于控制循環(huán)內(nèi)的計數(shù)器
var i = 1, j = ++i;//i=2 j=2
var i = 1, j = i++;//i=2 j=1
++x并不總是和x = x+1完全一樣,++運算符從不進行字符串連接操作,它總是會將操作數(shù)轉(zhuǎn)換為數(shù)字并增1
var x = '1';
++x;//2
var x = '1';
x = x + 1;//'11'
4.遞減(--)
遞減--運算符的操作數(shù)也是一個左值,它通過Number()轉(zhuǎn)型函數(shù)把操作數(shù)轉(zhuǎn)換為數(shù)字,然后減1,并將計算后的值重新賦值給操作數(shù)
和遞增++運算符一樣,遞減--運算符的返回值依賴于它相對操作數(shù)的位置,當(dāng)遞減運算符在操作數(shù)之前,操作數(shù)減1并返回減1之后的值。當(dāng)遞減運算符在操作數(shù)之后,操作數(shù)減1并返回減1之前的值
var age = 29;
--age;
//相當(dāng)于
var age = 29;
age = age - 1;
前增量操作符與執(zhí)行語句優(yōu)先級相同,整個語句會從左向右求值
var num1 = 2;
var num2 = 20;
var num3 = --num1 + num2;//21
var num4 = num1 + num2;//21
后增量操作符在包含它們的語句被求值之后才執(zhí)行
var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2;//22
var num4 = num1 + num2;//21
在涉及++和--運算符時,如果將其用作后綴表達式,它和表達式應(yīng)該同一行。否則,行尾將填補分號,同時++或--將作為下一行代碼的前綴操作符并與之一起解析
x
--
y
Java將其解析為:
x;--y;
而代碼的本意是:
x--;y;
二、二元算術(shù)運算符
二元算術(shù)運算符包括加法(+)、減法(-)、乘法(*)、除法(/)和求余(%)
1.加法(+)
在多數(shù)程序設(shè)計語言中,加法通常是簡單的數(shù)字運算符,但在ECMAScript中,加法運算有大量的特殊行為,不僅可以進行數(shù)值加法運算,也可以進行字符串連接
加法運算遵循如下規(guī)則:
1)如果其中一個操作數(shù)是對象,則對象會轉(zhuǎn)換為原始值:日期對象通過toString()方法執(zhí)行轉(zhuǎn)換,其他對象通過valueOf()方法執(zhí)行轉(zhuǎn)換。由于多數(shù)對象valueOf()方法無法返回一個原始值,于是會通過toString()方法來執(zhí)行轉(zhuǎn)換
2)在進行了對象到原始值的轉(zhuǎn)換后,如果其中一個操作數(shù)是字符串的話,另一個操作數(shù)也會轉(zhuǎn)換成字符串,進行字符串連接
3)否則,兩個操作數(shù)都將轉(zhuǎn)換成數(shù)字或NaN,進行加法操作
//單數(shù)值數(shù)組和valueOf()返回值為數(shù)值的自定義對象會轉(zhuǎn)換為數(shù)值
console.log(1 + []);//1
var o = {
valueOf: function(){
return -1;
}
}
console.log(1 + o);//0
//其他原生對象則轉(zhuǎn)換為字符串
console.log(1 + {});//'1[object Object]'
console.log(1 + [1,2]);//'11,2'
console.log(1 + new Date());//'1Thu Jun 16 2016 10:27:13 GMT+0800 (中國標(biāo)準(zhǔn)時間)'
console.log(1 + /0/);//'1/0/'
如果進行算術(shù)加法運算,undefined轉(zhuǎn)換為NaN,null轉(zhuǎn)換為0,false轉(zhuǎn)換為0,true轉(zhuǎn)換為1
console.log(undefined + undefined);//NaN
console.log(null + null);//0
console.log(false + false);//0
console.log(true + true);//2
如果進行字符串連接,undefined轉(zhuǎn)換為'undefined',null轉(zhuǎn)換為'null',false轉(zhuǎn)換為'false',true轉(zhuǎn)換為'true'
console.log('' + undefined);//'undefined'
console.log('' + null);//'null'
console.log('' + false);//'false'
console.log('' + true);//'true'
因此,利用加號運算符的特性,可以利用''+任意類型值轉(zhuǎn)換為字符串
在數(shù)字加法運算中,Infinity和帶符號的0的處理較為特殊
Number.MAX_VALUE + Number.MAX_VALUE === Infinity;//true
Infinity + (-Infinity);//NaN
+0 + (-0) === +0;//true
2.減法(-)
相對于加法,減法就簡單的多,只涉及到數(shù)字的減法運算。使用Number()轉(zhuǎn)型函數(shù)將非數(shù)值類型轉(zhuǎn)換為數(shù)值或NaN
console.log(1 - {});//NaN
console.log(1 - [1,2]);//NaN
console.log(1 - /0/);//NaN
console.log(1 - []);//1
加法有一個特殊之處,在于時間Date對象進行加法運算時使用toString()轉(zhuǎn)換為字符串,而在其他數(shù)學(xué)運算,包括減法、乘法、除法、求余等運算中,都是使用Number()轉(zhuǎn)換函數(shù)將時間Date對象使用valueOf()轉(zhuǎn)換為數(shù)字
console.log(new Date() + 1);//'Thu Jun 16 2016 11:11:49 GMT+0800 (中國標(biāo)準(zhǔn)時間)1'
console.log(new Date() - 1);//1466046941641
undefined轉(zhuǎn)換為NaN,null轉(zhuǎn)換為0,false轉(zhuǎn)換為0,true轉(zhuǎn)換為1
console.log(1 - undefined);//NaN
console.log(1 - null);//1
console.log(1 - false);//1
console.log(1 - true);//0
3.乘法(*)
乘法操作符由一個星號(*)表示,用于計算兩個數(shù)值的乘積,會通過Number()轉(zhuǎn)型函數(shù)將非數(shù)值類型轉(zhuǎn)換為數(shù)值或NaN
+ Infinity * 0;//NaN
- Infinity * 0;//NaN
Infinity * 非0數(shù)值;//Infinity或-Infinity
Infinity * Infinity;//Infinity
4.除法(/)
除法操作符由一個斜線(/)表示,執(zhí)行第一個操作數(shù)除以第二個操作數(shù)的運算,也會通過Number()轉(zhuǎn)型函數(shù)將非數(shù)值類型轉(zhuǎn)換為數(shù)值或NaN
Infinity / Infinity;//NaN
0 / 0;//NaN
非0數(shù)值 / 0;//Infinity或-Infinity
Infinity / 0;//Infinity
Infinity / 非0數(shù)值;//Infinity
5.求模(%)
求模(余數(shù))操作符是由一個百分號(%)表示,是第一個操作數(shù)除以第二個操作數(shù)的余數(shù)
//r是余數(shù),n是被除數(shù),d是除數(shù),
//q是整數(shù),在n/d為負時為負,在n/d為正時為正,它應(yīng)該在不超過n和d的商的前提下盡可能大
r = n - (d * q)
求模結(jié)果與第一個操作數(shù)的符號保持一致
console.log(5 % 2);//1
console.log(5 % -2);//1
console.log(-5 % 2);//-1
console.log(-5 % -2);//-1
被除數(shù)是Infinity,或除數(shù)是0,則求模結(jié)果是NaN
Infinity % 0 = NaN
Infinity % Infinity = NaN
Infinity % 非0數(shù)值 = NaN
非0數(shù)值 % 0 = NaN
在多數(shù)編程語言中,求模運算符只接受整數(shù)為操作數(shù),而在ECMAScript中,還接受浮點操作數(shù),但由于浮點數(shù)不是精確的值,無法得到完全準(zhǔn)確的結(jié)果
console.log(6.5 % 2.1);//0.19999999999999973
總的來說,算術(shù)運算符相對于我們數(shù)學(xué)中的算術(shù)來說其實是大同小異的,只是部分運算規(guī)則發(fā)生了變化,殊途同歸,對于有一定數(shù)學(xué)基礎(chǔ)的同學(xué)來說,學(xué)好算術(shù)運算符指日可待。當(dāng)然,如果看了本站的Java零基礎(chǔ)教程中對算術(shù)運算符的講解那更是如虎添翼,更上層樓。
初級 202925
初級 203221
初級 202629
初級 203743