Java运算符和数据类型转换(3.4-3.6)
 
 
- 3.4-3.6学习知识点
- 运算符及表达式
- 算术运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 赋值运算符
- 逻辑运算符
- 运算符的优先级
- 数据类型转换
- 自动类型转换
- 手动强制类型转换
- 隐含强制类型转换
- 运算符及表达式
 
 
一、 运算符及表达式
 Java可以对各种类型的数据进行加工,这种加工过程称为运算 。其中表示各种不同运算的符号称为运算符 ,参与运算的数据称为操作数 。操作数和运算符按一定语法形式组成的符号序列称为表达式。每个表达式经过运算后都会产生一个确定的值。
**📒运算符按其功能分为七类:**
1. 算术运算符 + 、-、 \*、 /、%、 ++、 --
2. 关系运算符 > 、<、 >=、 <=、 ==、 !=
3. 逻辑运算符 !、&&、||、&、|
4. 位运算符 >>、<<、>>>、&、|、^、~
5. 条件运算符 ?:
6. 赋值运算符 =、+=、-= 、\*= 、/=
7. 其他:下标运算符[]
📒运算符按其要求的操作数个数分为三种:
|
 
1.1 算术运算符
**📒算术运算符中的单目运算符**
如 +(一元加,取正值)、
-(一元减,取负值)、
++ (增1运算符)、\-\- (减1运算符)
增1运算符(++)和减1运算符(--): (1)增1运算符(减1运算符)在操作数的前面,首先对操作数本身进行增减1运算,然后再参与其所在表达式的 |
1 | 练习题1:写出该程序的输出结果 |
**📒算术运算符中的双目运算符 **
如 +(加)、-(减)、\*(乘)、/(除)、 % (取余数或取模)。
+,-,\* 是通常意义的加、减、乘
如果整数相除,则结果取整。如 5/2 得到结果2。
如果浮点数相除,则是我们通常意义上的除法,如5.0/2.0结果为2.5。
%是取余,如 5%2结果为1
5.2%2结果为1.2
5.2%2.2结果为0.8
10%-4结果2; -10%-4结果-2
注意: 如果整数相除或取模 第二个操作数为0 编译无错 运行会出错 抛出异常;
|
思考:某个培训中心要为新到的学员安排房间,假设共有x个学员,每个房间可以住6人,让你用一个公式来计算他们要住的房间数?
答案: (x+5)/6
这也可以用于计算留言板的页数。
 
 
1.2 关系运算符
**1.关系运算符有七种:**== ,!= ,< ,<= , > ,>= , instanceof (对象运算符) **2.关系表达式的结果类型为布尔型** **3.instanceof:**用来确定一对象是否是某一指定类的对象1 | class test |
 
📒关系表达式
 
 
1.3 逻辑运算符
1 | 例:分析下列程序的输出结果 |
 
 
1.4 位运算符
1 | 例:分析下列程序的输出结果 |
注意:
(1)右移n位后的结果与除以2的n次方效果相同
(2)左移n位后的结果与乘以2的n次方效果相同
(3)无符号右移要慎重
思考: 如何用一个表达式计算2的X次方?
答案: 1<<x
将1左移x位
 
 
1.5 赋值运算符
**(1)简单赋值运算符 = **
将等号右边的表达式的值赋给等号左边的变量
例如: int c,d;
c=1;
d=c+10;
**(2)复合赋值运算符 +=、-=、*=、/=、%= 等**
一般形式为: 变量 op= 表达式
等价于: 变量 =变量 op 表达式
c += a; //c = c +a;
c -= a; //c = c -a;
c *= a; //c = c * a;
例:int a=1; 注意:
|
 
 
1.6 条件运算符
Java 中唯一的三元运算符,其格式如下:
  变量 = <布尔表达式> ? <表达式1> : <表达式2>
含义是:当<布尔表达式>为真时,变量的值为<表达式1>的值,否则为<表达式2>的值。
1 | 例: 条件运算 |
 
 
二、 运算符的优先级
表达式的运算次序取决于表达式中各种运算符的优先级。
(1)优先级高的先运算,优先级低的后运算。
(2)括号( )的优先级最高。
(3)优先级相同的情况下要考虑结合性,即从左向右运算还是从右向左运算。
Java语言规定的运算符的优先级如下表所示
**运算符的优先级与结合性的一些规律:**
1. 优先级
() > 单目运算符 > 双目运算符 > 三目运算符 > 赋值运算符
双目: 算术>关系>逻辑 。
2. 结合性
大多数运算符结合性为从左至右
赋值运算符的结合性为从右至左
int a,b=3,c=5;
a = b = c; //结果:a、b、c均为 5
表达式写法的习惯: (1) 除非是简单的直观运算,应该尽量使用括号 |
1 | 例: |
 
表达式写法的习惯:
(1) 除非是简单的直观运算,应该尽量使用括号
(2)另外,尽量不要写太长的表达式,过长的表达式容易引 起对求值次序的误解。
 
 
三、 数据类型转换
3.1 自动类型转换
(1) Java中整型、实型、字符型数据可以混合运算。
运算过程中,Java自动把精度较低的类型转换为另一种精度较高的类型。
(2) 低精度的值赋给高精度的变量可以自动转换,不出现编译错误;相反会出现编译错误,需要强制转换。
例如: float x=(float)5.0;long x=2;
注意: 如果byte、short、char在一起运算时,会先将这些值转换为int型。再进行运算,结果为int型。 如表达式中一个变量是int型,另一个是long型,则先将int型转为long型,再进行计算。最后结果为long型。
1 | 下列代码会编译出错,提示c = (a + b);有精度损失 |
练习题3:
下列表达式结果是什么类型?
‘A’+2+2.5
double
 
 
3.2 手动强制类型转换
在Java中直接将高精度的值赋给低精度的变量会导致编译出错。这时可用强制类型转换来解决。
形式为:
   (类型名)表达式
例如:
int i; byte b,c;
b=(byte)345; //上机测试知b得到89
c=(byte)356; //上机测试知c得到100
i=(int)(3.8+6); //强制转换后小数部分被截去,i得到9,不会四舍五入
注意:
- 强制类型转换可能造成信息的丢失;
- 布尔型与其它基本类型之间不能转换。
1 | 加上强制类型转换,下列代码编译通过。 |
**运算时注意(一般的运算都有类型提升功能):** (1)在运算过程中,运算的结果至少是int型,即如果参与运算的两个数级别比int型低或是int型,则结果为 int型; (2)参与运算的数据如果有一个级别比int型高,则运算结果的类型与类型级别高的数相同; (3)参与运算的两个数据如果类型不一样,会先把低级的数据转换成高级的类型的数据后再作运算,结果是高 级的类型。 |
 
 
3.3 隐含强制类型转换
Java中允许把int类型的常量赋给byte、short变量时不需要强制类型转换
byte b=123;//合法
short s=123;//合法
b=b+3; //不合法
 
但是把int类型的变量赋给byte、short类型的变量时必须强制转换,否则会出错
int i=123;
byte b=i; //正确的做法是byte b=(byte)i;
byte a = 1; byte c = (byte)(a + b);
练习
设x,y,a分别为float,double,byte型变量,x=3.3,y=2.9,a=5, 则表达式x+ (int)y/ 3*a的值为多少?值的类型是什么?