Java中的运算符分类:
5.1 算术运算符
?
5.1.1算术算符
在Java中,使用算术运算符+、-、*、/、%表示加、减、乘、除、求余运算。
注意:当运算/运算时,两个都是整数是,表示整数除法,否则表示浮点除法。
两个数进行算术 运算时,结果向高字节数据类型隐式转换
?
示例:
步骤1:在Demo010项目中的com.zjk.type包中创建Arithmetic类
源码:
package com.zjk.type;
/**
*
*@类名 Arithmetic
*@日期 2015年11月28日下午6:59:47
*@作者
zjkorder
*@版本 v1.0
*@描述????
*
* 算术运算符
* main方法所在类
*/
public
class
Arithmetic {
????
????/**
???? * 主方法
???? * @Title: main
???? * @Description: TODO(这里用一句话描述这个方法的作用)
???? * @param
@param args 设定文件
???? * @return void
???? * @throws
???? *
???? */
????public
static
void main(String[] args) {
????????
????????int
a = 7; //声明并赋值一个整型
????????
????????int
b = 2; // 声明并赋值一个整数
????????
????????double
c = 2.0;// 声明并赋值一个浮点数
????????
????????int
d = a*b; //两个整数相乘的结果为整数
????????
????????int
e = a/b; //两个整数相除的结果为整数
????????
//????????int g = a*c;
????????
//????????int f = a/c;// 错误:Type mismatch: cannot convert from double to int. 原因:两个进行算术只要其中一个为浮点数,其结果为浮点数
????????
//????????int h = 2.8%2;//错误:Type mismatch: cannot convert from double to int
????????
????????double
h = 2.8%2; //浮点数的取余运算时通过的
?
????????System.out.println(h);//原因:浮点数取余运算,存在精度丢失
????????
????}
?
}
?
5.1.2数据类型之间的转换
?
在程序运行时,经常需要将一种数值类型转换为另一种数值类型。数值之间的合法转化关系(自动转化):
?
注释: 黑色箭头表示无信息丢失的转换
灰色箭头表示可能有精度损失的转换
低字节向高字节自动转换,不存在精度丢失。
相同字节大小的来个数据类型转换,有可能存在精度丢失。
5.1.3强制数据类型转换
?
数据类型从低字节向高字节转换是 自动转换,当高字节向低字节转换是需要强制转换。
强制类型转换:
double
d3 = 10.9879786586587;
????????float
f3 = (float)d3; //double类型转换为float
?
扩展技巧: 想要取一个浮点数最近的整数?
double
d = 9.98;
????int
i = (int)Math.round(d);//Math.round();四舍五入
?
示例:
步骤1在Demo010项目中的com.zjk.type包中创建Convert类
源码:
package com.zjk.type;
/**
*
*@类名 Convert
*@日期 2015年11月28日下午7:49:08
*@作者
zjkorder
*@版本 v1.0
*@描述????
* 数据类型之间转换
* main方法所在类
*/
public
class
Convert {
????
?
????
????/**
???? * 主方法
???? * @Title: main
???? * @Description: TODO(这里用一句话描述这个方法的作用)
???? * @param
@param args 设定文件
???? * @return void
???? * @throws
???? *
???? */
????public
static
void main(String[] args) {
????????
????????byte
b1 = 1; //声明赋值字节类型的整数a
????????
????????short
s1 = b1; //正确,byte 可以自动转换为short
????????
?
????????char
c1 = ‘a‘;//声明一字符型
????????
????????int
i1 = c1;//正确,字符型可以自动转换为int型
????????????????
????????int
i2 = s1; // 正确,short 可以自动转化为
int
????????
????????long
l1 = i2;// 正确
,int可以自动转化为long型
????????
????????double
d1 = i2;// 正确
,int可以自动转化为double型
????????
????????System.out.println("不存在精度丢失的自动转换");
????????System.out.println("转换关系/数据类型\t\t\t值");
????????System.out.println("a-->char\t\t\t"+c1);
????????System.out.println("char-->int\t\t\t"+i1);
????????System.out.println("1-->byte\t\t\t"+b1);
????????System.out.println("byte-->short\t\t\t"+s1);????
????????System.out.println("short-->int\t\t\t"+i2);
????????System.out.println("int-->long\t\t\t"+l1);
????????System.out.println("int-->double\t\t\t"+d1);
????????
?
????????
????????int
i3 = 2_147_483_647;//一个int类型数据的最大值
????????
????????float
f1= i3; //存在精度丢失
????????
????????long
l2 = 9_223_372_036_854_775_807L;//long 类型的最大值
????????
????????float
f2 = l2;//存在
精度丢失
????????
????????double
d2 = l2;//存在精度丢失
????????
????????System.out.println("存在精度丢失的自动转换");
????????System.out.println(" 转换关系/数据类型\t\t\t值");
????????System.out.println(" 2_147_483_647-->int\t\t\t"+i3);
????????System.out.println(" int-->float\t\t\t"+f1);
????????System.out.println("9_223_372_036_854_775_807L-->long\t\t\t"+l2);
????????System.out.println(" long-->float\t\t\t"+f1);
????????System.out.println(" long-->double\t\t\t"+f1);
????????
?
????????
????????double
d3 = 10.9879786586587;
????????float
f3 = (float)d3; //double类型转换为float
????????int
i4 = (int) f3; //float 类型强制转换为int
类型
????????
?
????
?
????????
?
????????
????????System.out.println("强制转化");
????????
????????System.out.println("转换关系/数据类型\t\t\t值");
????????System.out.println("10.9879786586587-->double\t\t\t"+d3);
????????System.out.println("double-->float\t\t\t"+f3);
????????System.out.println("float-->int\t\t\t"+i4);
????????
????????
????}
?
}
?
5.14数据类型转换精度丢失原理
?
在CUP中 数据运算主要是在寄存器中运行的,而计算机的寄存器的空间的相当有限的,所以程序语言规定数据类型的大小,所以每一个数据类型都有自己的字节大小:
高字节向低字节转换:
?
后四位为小数部分
前四位为整数部分
?
5.2自增运算符与自减运算符
?
1:n++运算符,先返回值,再加加:
2:++n运算符,先加加,再返回值:
3:n---运算符,先返回值,再减减:
4:--n运算符,先减减,再返回值
?
示例:
步骤1在Demo010项目中的com.zjk.type包中创建IncrementAndSelfReduction类
源码:
package com.zjk.type;
/**
*
*@类名 IncrementAndSelfReduction
*@日期 2015年11月28日下午9:15:52
*@作者
zjkorder
*@版本 v1.0
*@描述????
* 自增自减运算
* main方法所在类
*/
public
class
IncrementAndSelfReduction {
?
????/**
???? * 主方法
???? * @Title: main
???? * @Description: TODO(这里用一句话描述这个方法的作用)
???? * @param
@param args 设定文件
???? * @return void
???? * @throws
???? *
???? */
????public
static
void main(String[] args) {
????????int
i = 1;
????????System.out.println("i\t"+i);
????????System.out.println("i++\t"+(i++));
????????System.out.println("i\t"+i);
????????System.out.println("++i\t"+(++i));
????????System.out.println("i\t"+i);
????????System.out.println("i--\t"+(i--));
????????System.out.println("i\t"+i);
????????System.out.println("--i\t"+(--i));
????????System.out.println("i\t"+i);
????}
}
?
5.3关系运算符与boolean运算符
?
<(小于), >(大于),<=(小于等于),>=(大于等于)
&& 逻辑与 || 逻辑或 !逻辑非
三目运算符:
condition ? expression1 : expression2;
当条件condition 为真时 计算expression1表达式,否则执行expression2表达式
?
示例程序:
步骤1:步骤1在Demo010项目中的com.zjk.type包中创建RelationalOperators类
?
源码:
package com.zjk.type;
/**
*
*@类名 RelationalOperators
*@日期 2015年11月28日下午9:36:31
*@作者
zjkorder
*@版本 v1.0
*@描述????
* 逻辑运算符
* main方法所在类
*
*/
public
class RelationalOperators {
?
????public
static
void main(String[] args) {
????????
????????int
a = 10;
????????
????????int
b = 5;
????????
????????boolean
t = true;
????????
????????boolean
f = false;
????????
?
????????
????????System.out.println("a<b\t"+(a<b));
????????System.out.println("a>b\t"+(a>b));
????????System.out.println("a>=b\t"+(a>=b));
????????System.out.println("a<=b\t"+(a<=b));
????????System.out.println("!t\t"+(!t));
????????System.out.println("t&&f\t"+(t&&f));
????????System.out.println("t||f\t"+(t||f));
????????System.out.println("a < b ? (a+b):(a-b)\t"+(a < b ? (a+b):(a-b)));
????????
????}
?
}
?
?
5.4位运算符
?
& ("与")
| ("或")
^ ("异或")
~ ("非")
?
?
?
?