第2章运算符.docx
- 文档编号:24920532
- 上传时间:2023-06-02
- 格式:DOCX
- 页数:66
- 大小:40.89KB
第2章运算符.docx
《第2章运算符.docx》由会员分享,可在线阅读,更多相关《第2章运算符.docx(66页珍藏版)》请在冰豆网上搜索。
第2章运算符
第2章运算符
考点01运算优先级
规则01:
JAVA语言中运算符优先级如下所示(优先级从上至下依次递减):
类型运算符
单操作运算符++--+-!
~()
算术运算符*/%+-
移位运算符<<>>>>>
比较运算符<<=>>=instanceof!
=
按位运算符&^|
逻辑运算符&&||
条件运算符?
:
赋值运算符=
规则02:
JAVA语言中规定,表达式中运算顺序从左至右。
示例01:
给出以下代码,请问该程序的运行结果是什么?
classExample{
publicstaticvoidmain(Stringargs[]){
int[]refToArray={10,11};
intvar=1;
refToArray[var-1]=var=2;
System.out.println(refToArray[0]+""+refToArray[1]);
}
}
请选择一个正确答案:
(1)编译失败。
(2)运行期异常。
(3)打印输出211
(4)打印输出102
答案(3)
详解:
本题考查的核心是运算的顺序。
在本例中,难点在于变量var是被用作计算数组下标之前还是之后其值被改变了。
如果先被改变,则计算出数组下标1(2-1)变量var的新值2被存储在数组的第二个元素refToArray[1]中。
如果先被用来计算数组下标,则计算出的数组下标为(1-1),变量var的新值被值2被存储在数组的第一个元素refToArray[0]中。
根据java语言的规定,运算顺序从左至右,赋值顺序从右至左。
本例中先计算数组下标,结果为0,因此变量新值2被赋予数组元素refToArray[0],所以最终输出为211。
示例02:
给出以下代码,请问该程序的运行结果是什么?
classExample{
publicstaticvoidmain(Stringargs[]){
intvar=10;
intvar2=20;
System.out.println(var+var2+++""+var2);
}
}
请选择一个正确答案:
打印输出3020
打印输出3021
打印输出3120
打印输出3121
答案:
(2)
详解:
本题考查的核心是运算的顺序,++为自动递增操作,如果它位于表达式之前,则为前级递增,意味着先执行递增运算,再生成值。
如果它位于变量或表达式后,则为后缀递增,意味着先生成值,后再执行递增运算,在示例中,++运算符位于表达式var1+var2之后,所以先计算表达式的值为30(10+20),后执行递增,即var2的值增为21,由于表达式var1+var2+++””+var2中存在一个空字符串,所以字符串两边运算符+被自动当作字符串连接符,所以最终结果为一个字符串“30”+“”+“21”,所以输出为3021。
示例03:
给出以下代码,请问该程序的运行结果是什么?
classExample{
publicstaticvoidmain(Stringargs[]){
intx=1;
inty=~x+1;
System.out.println(x+""+y);
}
}
请选择一个正确答案:
(1)打印输出-11
(2)打印输出11
(3)打印输出1-1
(4)打印输出-1-1
答案:
(2)
详解:
本题考查的核心是运算的顺序。
~为按位运算符中的非运算符,属于一元运算,即只对一个自变量进行操作,生成与输入相反的值。
如果输入为0,则输出为1;如果输出为0,变量x取值为1,该值的按位表示为0001,经过按位非运算为1110,其值为-2。
经过按位转换的结果并不存储在变量x中,即变量x的值仍为1,所以最终的输出结果为11。
示例04:
请问表达式(short)10/10.2*2的运行结果是什么类型的数据?
请选择一个正确答案:
(1)short
(2)int
(3)double
(4)float
(5)编译错误。
答案:
(3)
详解:
本题考查的核心是运算的顺序。
在示例中,由于造型运算优先于运算,且除运算和运算同级,因此表达式的计算过程为先把数10造型成一个short型整数,然后再转换为一个double型数与10.2相除结果以已转换的数2,因此最终结果的类型为double型。
考点02单操作数运算符
规则01:
单操作运算符不像大多数具有两个操作数的运算符,其中只有一个操作数。
Java语言共提供了7种单操作运算符,分别为自动运算符++,自动递减运算符--,取正运算符+,取负运算符-,按位取反运算符~,逻辑取反运算符!
以及造型运算符()。
规则02:
自动递增运算指操作数加1运算。
根据自动递增运算符和操作数的位置关系,自动递增运算又可分为前自动递增运算和后自动递增运算。
前自动递增指运算符位于操作数的前面,后自动递增运算指运算位于操作数的后面。
规则03:
前自动递增运算和后自动递增运算对于操作数的改变是一样的,在原有值上均;加1。
如果自动递增运算位于表达式中,则前自动递增和后自动递增运算的意义就不同了。
前自动递增运算意味着先执行递增运算,后生成表达式值;后自动递增运算意味着先生成表达式值,后执行递增运算。
以下表格清楚地解释了前缀运算和后缀运算的差异以及操作数和表达式的结果差异:
变量x初始值表达式表达式终值变量x终值
1++x22
1x++12
1y=++x22
1y=x++12
规则04:
自动递减运算指操作数减1运算。
根据自动递减运算符和操作数的位置关系,自动递减运算又可分为前自动递减运算。
前自动递减运算指运算符位于操作数前面,后自动递减运算即指运算符位于操作数的后面。
规则05:
前自动递减运算和后自动递减运算对于操作数的改变是一样的,在原有值上均减1。
如果自动递减运算位于表达式中,则前自动递减运算和后自动递减运算意义就不同了。
前自动递减运算意味着先执行递减运算,后生成表达式值,后自动递减运算意味着先生成表达式值,后执行递减运算。
以下表格清楚地解释了前缀运算和后缀运算的差异以及操作数和表达式的结果差异:
变量x初始值表达式表达式终值变量x终值
1--x00
1x--10
1y=--x00
1y=x--10
规则06:
取正运算符+,取负运算符-在形式上和算术加运算符+,算术减运算符-一样,但编译器可以根据运算表达式所处上下文自动判断应属于哪种运算。
取正运算符的有无不影响表达式的结果,其存在只是为了更清楚地表达,取负运算的对象用括号括起来。
规则07:
按位取反运算~对一个整数型操作进行按位操作,生成与输出相反值。
若输入为0,则输出为1;若输入为1,则输出为0。
规则08:
逻辑取反运算!
对一个布尔型操作进行操作,生成与输入位相反值。
若输入为true,则输出为false;若输入为false,则输出为true。
规则09:
造型运算()的作用就是明确将一种数据类型转换为另一种类型,即使可能造成数据信息丢失。
在java中,合法的类型转换编择器会自动进行,只有在强制转换时,程序员才有必要进行造型运算。
程序员应把造型运算用于使代码更清楚,而不是冒丢失数据风险使用造型运算。
造型运算的操作对象不仅是基本数据类型,也可以是引用型。
示例01:
给出以下代码,请问该程序的运行结果是什么?
publicclassExample{
publicstaticvoidmain(Stringargs[]){
intx=5;
inty=4;
y=x++;
System.out.println(y);
}
}
请选择一个正确答案:
(1)4
(2)5
(3)6
(4)7
答案:
(2)
详解:
本题考查的核心是单操作数运算符—自动递增运算符++,由于后自动递增运算先生成表达式值,后再执行递增运算。
在示例中,先进行增1运算,所以最终变量y输出为5。
示例02:
给出以下代码,请问该程序的运行结果是什么?
classExample{
publicstaticvoidmain(Stringargs[]){
intm=0;
while(m++<2)
System.out.println(m);
}
}
请选择所有正确答案:
(1)0
(2)1
(3)2
(4)3
(5)用期抛出异常。
答案:
(2)(3)
详解:
本题考查的核心单操作运算-自动递增运算符++,在示例中,由于是后自动递增运算符,因此每次循环先进行比较运算在自动加1,然后打印输出的是加过1的m,而不是m值。
考点03算术运算符
规则01:
java供了5种运算符,分别为加运算符+,减运算符-,乘运算符*,除运算符
/和取模运算符%。
规则02:
加和减运算符用于对基本数值类型的数据进行加减运算,其运算符结果的数据类型取决于两个操作数的数据类型。
当两个操作数据类型为char,byte,short,int类型时,其运算结构的数据类型必为int,除此之外运算符结果的数据类型为两个操作中取值范围较宽的数据类型。
规则03:
当加减运算产生的运算符结果发生数据溢出时,不会抛出算术异常,只会导致结果数据精确性的丢失的现象。
规则04:
加和减运算符除了用于基本数值类型数据的算术加减运算外,还可用于引用性数据——字符串的连接运算,尽管JAVE语言不允许程序员过载操作符,但是其语言自身过载了算术操作符,用于将两个字符串连接起来。
该连接运算并不严格要求两个操作符均为字符串,只需要运算符两边的操作符至少有一个为字符串,其运算过程为。
先调试用非字符串操作对应的封装的toString(),然后在把两个字符串连接起来,构成一个新的字符串。
规则05:
乘运算用于对两个基本数值类型的数据进行相乘运算,其运算数据类型取决于两个操作数的数据类型。
当两个操作数数据类型为char,byte,short,int类型时,其运算结构的数据类型必为int,除此之外运算符结果的数据类型为两个操作中取值范围较宽的数据类型。
规则06:
当乘运算产生的运算结果发生数据溢出时,不会抛出算术异常,只会导致结果数据精确性丢失的现象。
规则07:
除运算符用于对两个基本数值的类型数据进行相除运算,当相除的两个操作数均为整数时。
如果运算结果为整数,则将运算结果作为返回值返回;如果运算结果不为整数,则去运算结果小数部分作为返回值返回。
当相除的两个操作数只要与一个为浮点值时,则结果为一个INFINITY值。
规则08:
当除运算中右操作数值取值为0时,如果操作数均为整数,则会抛出算术异常ArithmcticException,如果操作数中至少有一个为浮点值,则结果为一个INFINITY值。
规则09:
取模运算%用于从除法中获得两数相除的余数,取模运算的操作数可以是整数,也可以是浮点数。
取模的过程实际是用左操作数连续减去右操作数,直到相除的结果小于右操作数,此时的结果即为余数,此过程非常适于操作数有浮点数和负数的情况。
规则10:
当取模运算中有负数作为操作数时,取模运算结果的正负符号完全取决于左操作数,即和左操作数的正负符号一致。
规则11:
当取模运算中右操作数取值为0时,如果操作数均为整数,则会抛出算术异常ArithmcticException,因为取模运算归根结底为算术除法运算:
如果操作数至少一个浮点数,则结果为一个NaN(NotaNumber)值,在java语言中,浮点数有无限值(Irifinity)和NaN值的概念。
规则12:
在java语言中,Float和Double两个封装类型装有用于表示正常运算结果NaN和POSITIVE_INFINTY、NEGATIVE_INFINTY。
NaN常量类封装代表运算结果的常量,POSITIVE_INFINTY常量属性代表正无限大,NEGATIVE_INFINTY常量类属性代表负无限大,尽管两个INFINITY常量代表无限量,但其本身只是一个特殊数值,而不是非数值,其行为不同于NaN值,可以用于比较逻辑运算中,而代表非正常数值结果的常量NaN值,尽管可以被运用到逻辑运算中和任何值进行比较,包括和自身进行比较,其比较运算结果都一样为flase,只能调用Float和Double两个封装类上定义的方法,才能获得正确的比较结果。
示例01:
访问,表达式5.4+“3.2”的结果是什么?
(1)双精度型值8.6
(2)字符串型值“8.6”
(3)长整型值8
(4)字符串型值“5.43.2”
答案:
(4)
详解:
本题考查的核心是字符串连接运算符,+除了可以用作数值间两数相加的运算外,还可以做语言过载用于连接两个字符串,要求运算符两边的运算数均为字符串或者至少有一个为字符串,其运算结果为将非字符串,然后连接两个字符串,示例运算过程为:
先将数值5.4转换为字符串“5.4”,然后与字符串“3.2”串连,构成一个大字符串“5.43.2”。
示例02:
给出以下代码,请问该程序的运算结果是什么?
classExample{
publicstaticvoidmain(String[]args){
System.out.println(9+8%7+6);
}
}情选择一个正确答案:
(1)17
(2)16
(3)13
(4)4
答案:
(2)
详解:
本题考查的核心是取模操作符,取模运算符%用于从整数除法中获得余数,在示例中,表达式8%7的结果为1,所以最终的结果为9+1+=16。
示例03:
给出以下代码,请问该程序的运算结果是什么?
classExample{
publicstaticvoidmain(Stringargs[]){
System.out.println(3/0);
}
}
请选择一个正确答案:
(1)编译失败。
(2)运行期异常
(3)Java.lang.ArithmeticException异常抛出。
(4)打印输出Infinity
答案:
(3)
详解:
本题考查的核心是算术运算,在本例中,表达式3/0是非法的,因为除数不能为0,且在JAVA语言中整数除以一个整数0,将导致一个算术异常ArithmeticException被抛出。
示例04:
给出以下代码,请问该程序的运行结果是什么?
ClassExample{
Publicstaticvoidmain(Stringargs[]){
System.out.println(3.0/0):
}
}
请选择一个正确答案:
(1)编译失败
(2)运行期异常。
(3)Java.lang,ArithmeticException异常抛出。
(4)打印输出Infinity.
答案:
(4)
详解:
本题考查的核心是算术运算,在本例中,表达式3.0/0是非法的,因为除数不能为0,注意此算术运算式是混合类型运算,即一个浮点数除以一个整数,根据JAVA语言规定,两个不同类型的数作运算,以取值范围大的为标准,因此结果应为浮点数,浮点数有无限的NAN概念,所以表达式不会导致一个算术异常ArithmeticException被抛出,而是输出Infinity常量。
示例05:
给出以下代码,请选择正确的描述?
代码片断1:
inta=3:
intb=0:
intc=a/b
floata=1.0F:
floatb=0.0F:
floatc=a/b:
请选择一个正确答案:
(1)执行两段代码都会抛出异常。
(2)执行两段代码都无异常抛出。
(3)执行两段代码,只有代码片断1抛出异常,
(4)执行两段代码,只有代码片断2抛出异常。
答案:
(3)
详解:
本题考查的核心是算术运算,在本示例中,代码片断1中,表达式3/0是非法的,因为除数不能为0,所以此表达式会导致一个算术异常ArithmeticException被抛出。
代码片断2中的表达式1.0/0.0尽管也因为除数是0是非法的,但浮点数有无限值和NAN概念,所以此表达式不会导致算术异常ArithmeticException被抛出,而是而是输出Infinity常量。
示例06:
给出以下代码,请问该程序运行的结果是什么?
classExample{
publicstaticvoidmain(Stringargs[]){
bytex=-64;
bytey=-6;
System.out.println(x/y+""+x%y);
}
}
请选择一个正确答案:
(1)编译失败。
(2)运行期异常。
(3)104
(4)10-4
答案:
(4)
详解:
本题考查的核心是算术运算。
/为除号,完成两个数的相除运算。
如果相除的两个操作数均为整数,则结果为整数,返回值为同型值。
如果结果不为整数,则返回值去结果的小数部分,在本示例中,-64/-6的结果为10,%为取模运算中,余数的正负符号完全取决于左操作数,即和左操作数的正负符号一致。
本例中-64%-6的结果为负4而不是正4,因此选项(4)正确。
示例07:
给出以下代码,请问该程序运行的结果是什么?
classExample{
publicstaticvoidmain(Stringargs[]){
doublex=64.5;
doubley=6.0;
System.out.println(x/y+""+x%y);
}
}
请选择一个正确答案:
(1)编译失败。
(2)运行期异常。
(3)10.754.5
(4)10.750
答案:
(3)
详解:
本题考查的核心是算术运算,如果相除的两个操作数有一个浮点数,则结果为浮点数,在示例中,64.5/6.0的结果为10.75,示例的难点在于取模运算操作数中有浮点数,取模运算过程为,用左边的操作数连续地减去右边的操作数,直到结果小于右边的操作数,此时的结果即为余数,示例中64.5%6.0的结果为64.5,连续地减去6.0共10次,得到的余数为4.5.
示例08:
给出以下的代码,请问该程序的运算结果是什么?
classExample{
publicstaticvoidmain(Stringargs[]){
try{
doublex=64.0;
doubley=0.0;
System.out.println(x%y);
}catch(Exceptione){
System.out.println("Exception");
}
}
}
请选择一个正确的答案:
(1)编译失败。
(2)运行期异常。
(3)打印输出Infinity.
(4)打印输出NaN
答案:
(4)
详解:
本题考查的核心是取模运算符,尽管取模运算过程为,用左边的操作数连续地减去右边的操作数,直到结果小于右边的操作数,此时的结果即为余数,在示例中,由于右操作数为0,又因为去余数运算归根结底为除法运算,当右边操作数为0时,如果操作数均为整数,则余数抛出ArithmeticException异常:
如果操作数为浮点数,则结果为一个NaN值。
因此,本示例最终结果为打印输出NaN值。
示例09:
给出以下的代码,请问该程序的运算结果是什么?
classExample{
publicstaticvoidmain(Stringargs[]){
try{
intx=64;
inty=0;
System.out.println(x%y);
}catch(Exceptione){
System.out.println("Exception");
}
}}
请选择一个正确答案:
(1)编译失败。
(2)运行期异常。
(3)打印输出Infinity
(4)打印输出NaN
答案:
(2)
详解:
本题考查的核心是取模运算符,本示例与上一个示例考查的内容一样,只是第一种方式,即右边操作数为0时,左操作数为整数,则会抛出ArithmeticException异常。
示例10:
给出以下的代码,请问该程序的运算结果是什么?
classExample{
publicstaticvoidmain(Stringargs[]){
try{
doublex=64.0;
doubley=0.0;
System.out.println(x%y==x%y);
}catch(Exceptione){
System.out.println(“Exception”);
}
}
}
请选择一个正确的答案:
(1)编译失败。
(2)运行期异常。
(3)打印输出ture
(4)打印输出false
答案:
(4)
详解:
本题考查的核心是NaN值,NaN是一个封装在Float和Double类中的一个代表非正常数值结果的常量,尽管它可以被应用到逻辑运算中和任何值进行比较包括和自身进行比较,其比较运算结果都一样为false,在示例中,x%y的运算结果为一个NaN值,因为表达式x%y(64.0%0.0)的右操作数为0.表达式x%y=x%y等于NaN=NaN,所以该表达式运算结果为false。
示例11:
给出以下的代码,请问该程序的运算结果是什么?
classExample{
publicstaticvoidmain(Stringargs[]){
try{
System.out.println(Float.NaN==Float.NaN);
System.out.println(""+(Float.POSITIVE_INFINITY==Float.POSITIVE_INFINITY));
}catch(Exceptione){
System.out.println("Exception");
}
}
}
}
请选择一个正确的答案:
(1)编译失败。
(2)运行期异常。
(3)打印输出tureture
(4)打印输出falseture
(5)打印输出falsefalse
答案:
(4)
详解:
本题考查的核心是NaN和INFINITY常量。
INFINITY常量代表无限值,但其只是一个特殊数值,而不是非数值,其行为不同于NaN值,可以用于比较逻辑运算中,而不是NaN值只能调用isNaN()方法来获得正确的比较结果,所以打印输出为falseture。
考点04移位运算符
规则01:
java语言共提供来3种移位运算符:
带符号左移位运算符<<、带符号右移位运算符>>和无符号右移位运算符>>>,注意,在java语言中没有提供移位循环操作运算符。
规则02:
移位运算的操作数只能是整数型,即字符型、短数型、整型、和长整型,进行移位运算时,总是先将字符型值,字节型值转换为整型值再进行移位运算,实际上移位操作对象只有整型或长整型,这可能导致计算结果和预期的结果不一致。
规则03:
带符号左移位运算符将运算对象向左移动由运算符右侧指定的位数,在低位补0,即左移时最低位始终补0,最高位被舍。
带符号左移位运算符相当左操作进行乘2运算。
规则04:
带符号左移位运算符将运算符左边的运算对象向右移动由运算符右侧指定的位数,若值为正,则在高位插入0,若值为负,则在高位插入1,即移入的最高位和原最高位符号相同。
带符号的右移位运算相当对左操作数进行除2运算。
规则05:
无符号右移位运算使用了零扩展,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第2章 运算符 运算
![提示](https://static.bdocx.com/images/bang_tan.gif)