java第三章学习笔记:表达式----描述行为的元素

【因为每一章都篇幅比较长(10多页,难免有的地方会写错字,如发现请指正,本人不胜感激)】

上一章为基本数据,有了数据,就需要对数据进行操作,并介绍开发中常用的数学工具包

3.1不简单的算数运算符【+-*/】以及求余【%】

3/1/1 “+”运算符
java中虽然没有了运算符重载,但却将基础非常易用的运算符进行了重载。”+“就是其中之一,java中”+“运算符重载了以下三种功能:
1、加法运算
2、数值正号
3、字符串连接符
【运算符重载是指:同一个运算符在不同情况下执行不同操作】
1、加法运算:
只能对数值型数据进行操作

当两个数值型数据进行运算时,结果至少为int型,也就是参与运算的这两个操作数级别比int低或是int型,则结果为int型,若有一个比int型高,则结果与高的保持一致;
注意:实际上类型的提升是在运算之前完成的,即int和double运算,先将int提升为double,然后再运算
eg:

public class Test39 
{
    public static void main(String args[])
    {
        byte m=12;
        byte n=4;
        byte s=m+n;//错误。提示不能将int转为byte《eclipse直接报错,不用到编译》
        System.out.print(s);
    }
}

修改为byte s=(byte)m+n就OK了或者是int i=m+n;
注意:-*/%这些运算符均会自动提升

2、数值正号
在一个数值前面加上+,此时操作符+就起到数值正号的功能 eg:

        int m=+2;
        int n=+m;

其实,数值前不加符号系统会自动识别为正值,建议不要加,否则降低程序可读性;
3、字符串连接符
当数字和字符串连接时,+会将数值做字符串连接处理eg :

String a="三是"+3;//java中的String是首字母大写,没C#那么随意

注意:数字和字符串连接的顺序
这里写图片描述

原因:当执行a+m+n时,因为运算从左往右,首先执行a+m,a为字符串,所以进行字符串连接
如果希望得到预期结果将代码第11行改为
这里写图片描述
注意”“+i,就算i为数值类型,但是也会当做字符串进行操作

3.1.2”-“运算符
和+一样,-也被重载了
1、减法运算
2、取负运算
1、减法运算:也只能对数值类型操作,同样遵循自动提升,eg:

        byte a=23;
        byte b=12;
        int s=a-b;//若s为byte类型则报错

2、取负【此运算也遵循自动提升】
这里写图片描述

因为正负数个数不同,,so取负运算有时不能得到正确结果,eg:
这里写图片描述
打印结果有点意外,这是因为int的取值范围是-2147483648~2147483647(-2的31次方~2的31次方减一)产生了溢出
注意:其它整型也一样
3.1.3 ”*“运算符【此运算符仍具有自动提升能力】《无重载》
eg:
这里写图片描述

3.1.4 “/”运算符【此运算符仍具有自动提升能力】,重载两种除法运算
1、整除运算
2、浮点除运算
1、整除运算:
1》两个整数相除,结果为整数,若有小数部分,则将截取,只要整数部分eg:
这里写图片描述
注意:在整除中除数大于被除数,结果永远为0.eg计算扇形面积公式(x/360)*πR的平方。因为x的取值范围时从0到360的开区间,若x为整数,则结果永远为0,此时只能用浮点数计算才能得到正确结果
2》整数处于0,运行时报错(出书不能为0)
这里写图片描述
2、浮点除运算
若参与运算有一个为浮点数,则进行浮点除规则如下:
1》两个浮点数或一个浮点数与一个整数进行除法运算,结果将得到一个浮点数,即便结果是一个整数,也会被存储为浮点型值 eg:
这里写图片描述
2》正浮点数(非零浮点数)除以0,将得到Infinity(正无穷大)。eg:
这里写图片描述
3》负浮点数(非零浮点数)除以0,将得到-Infinity(负无穷大)。eg:
这里写图片描述
4》浮点数(0.0)除以0,得到NaN ,eg:
这里写图片描述
注意常量Double.POSITIVE_INFINITY、Double.NEGATIVE_INFINITY以及Double.NaN分别表示上述的三个特殊值,若是float型运算,则用常量:Float.POSITIVE_INFINITY,Float.NEGATIVE_INFINITY以及Float.NaN来表示这三种情况

3.1.5”%“运算符
求余运算(取模运算)即:将左边操作数除以右边操作数,得到的余数便是结果【此运算符也遵循自动提升】
java中的求余操作遵循如下步骤:
1、求出参与运算两数的绝对值
2、用左边操作数的绝对值减去右边操作数的绝对值,得到差
3、若差>右边操作数,则用差减去右边操作数绝对值,得到新的差
4、重复2直到差比右边操作数小,姜茶作为结果返回
5、结果的符号由左边操作数决定
其中,有两种特殊情况:
整数求余时,若右边操作数为0,则运行时报错
浮点数求余运算时,右边操作数为0,则得到NaN;
eg:
这里写图片描述
可得到:
1】结果符号和左边操作数一致
2】NaN:不知道结果是什么
3】15%0与整数相除出书不能为0一样

3.2 自增自减运算符

1、++:递增
2、–:递减
注意,这两个运算符改变了变量的值,其结果要有存放的地方,所以操作数不能为字面常量,eg:15++;是非法语句

自增自减不进行类型提升。操作前后类型不变,eg:

        byte a=12;
        byte b=a++;//这样写不会报错

自增自减除了a++,a–(后缀方式)这种形式外还有++a.–a,(前缀方式)在表达式中,这两种形式蕴意不同;
前缀方式是先执行自增自减,再运算表达式
后缀方式恰好相反,先运算后自增自减 eg:
这里写图片描述
建议不要在表达式中使用自增自减运算符

3.3 关系运算符

关系运算符总是生成boolean型结果,结果为真返回true,否则返回false
java中的关系运算符包括:
”==“:等于
”!=“:不等于
”>“:大于
”>=“:大于等于
”<=“:小于等于
3.3.1 等于不等于
【适用于所有的基本数据类型及引用类型,基本数据类型比较的是值是否相等,引用类型比较引用的是否是同一个对象】
不但可以比较快数据类型相同,也能比较数据类型不同,eg:
这里写图片描述
对于8中基本数据类型来说,boolean型只能与boolean型比较,其他其中则可以相互比较;
3、无穷大与NaN比较
【浮点运算时会出现正负无穷大与NaN】eg:
这里写图片描述
由此看出,不知道不等于不知道,所以java中规定两个NaN比较,返回false

3.3.2 比较大小运算符
用来比较数值型数据的大小,8中基本数据类型中除了boolean外都可以相互比较,在java中,比较大小运算符包括四种(大于,大于等于,小于,小于等于)
提示:比较大小运算符可以用来对无穷大。”NaN“进行比较,数值与无穷大比较是有意义的,但是与”NaN“比较是没有意义的,java中规定,任何数值与”NaN“比较都是返回false

3.4 逻辑运算

逻辑运算符能对逻辑值进行逻辑运算,产生一个boolean型结果,其操作数只能是boolean型,java中的逻辑运算符包括:与运算,或运算,非运算

3.4.1 “与”运算
规则:两个操作数全部为true,返回true,否则返回false。java中的与运算有两种:
短路与“&&”;(聪明与【左边操作数解析为false则不继续,直接返回false】)
这里写图片描述
非短路与“&”
3.4.2 “或”运算
规则:当两个都返回false时,才返回false;
短路或“||”【左边操作数解析为true时不再继续执行】
非短路或“|”【计算效率会下降】
在日常开发中一般英爱采用短路逻辑运算,这样可以提高运算效率,使用短路 逻辑运算时要注意,最好不要在表达式中修改变量的值,否则会得到意想不到的bug

3.4.3 “非运算“
”非运算“规则:若操作数值为true,则返回false,eg:
这里写图片描述
小结:括号内解析为布尔值,经过!运算后,结果全部取反。

3.5 三元运算符

因为运算中有三个被操作数语法如下:
(<逻辑表达式>)?<结果表达式1>:<结果表达式2>
eg:
这里写图片描述
提示:三元可以用if-else语句代替
三元运算符的结果表达式1,2为基本数据类型,则要求类型时兼容的,即值类型要能相互转换,否则会报错,eg:
这里写图片描述
若表达式1,2,均为引用类型,则永远都返回true,因为java中所有的二类都继承自java.lang.Object类
三元运算符返回值及表达式1,2遵循如下规则:
1、对于基本数据类型,若两个表达式类型不同,对int型一下的字面常量将尽量进行窄化,若不能窄化,返回级别最高的
2、窄化不能越界,eg:12能窄化为byte,但是129不行
3、变量不能窄化,按照最高级别的返回
4、对于引用类型,返回类型为两个表达式类型的最小公共父类
eg:

int a=23;int b=4;                                           
int c=678;                                                  
int b1=(a>b)?((byte)1234):123;//123 在byte内,所以也进行了窄化         
int b2=(a>b)?(12):123;//两个都是int,不存在窄化问题                     
long b3=(a>b)?34:56L;//若b3的数据类型为int会报错,因已经升级为long           
int b4=(a>b)?c:123;//c为int类型所以123也为int型                     

一个表达式不能有多个返回类型,并且返回类型要尽量窄。

3.6 位运算【能自动提升即经过位运算符结果至少为int】

对单个比特位进行位操作,位运算会对两个操作数中对应比特位执行布尔代数运算并产生一个结果。
java中有三种位运算符:
”&“与:若两者的对应位都是1则结果返回1,否则为0;
“ |”或:若两者对应为都为0则结果返回0,否则返回1;
”^“异或:若两者对应位值相同结果为0,否则为1;
“ ~”非:将操作数按位取反
提示:实际上,java中的&和|也被重载了。既表示逻辑运算符又表示位运算符

真值表
这里写图片描述
位运算过程:eg
(1)将两个数字分别转换为二进制表示,eg,12和2分别表示为:1100、0010
(2)将两个数字的二进制数按下图进行|运算
1100
| 0010
——————
1110 //有1为1
(3)最终结果为1110,对应10进制为14
代码验证:
这里写图片描述
”&“, ”^“与上述类似

3.7 移位运算(具备自动提升能力即,结果至少为int)

移位运算符目的是二进制的”位“,因此此运算符只能处理整形,将数字的位向左向右依次移动从而产生新数字,java中的移位运算符包括:<<(左移),>>(右移),>>>(无符号右移)

《8 4 2 0》
3.7.1 <<(左移)【左移几位就乘与2的几次方】
将运算符左边的整数按位向左移动右边整数指定的位数,具体过程:
(1)去一个整数,eg8,转为二进制数(int型有32位)
0000 0000 0000 0000 0000 0000 0000 1000
(2)将这个二进制数向左移动 左移运算符右边数字位(eg,1位),右边填0得到:
0000 0000 0000 0000 0000 0000 0001 0000
(3)最后转为十进制,得到16
程序实现:
这里写图片描述
左移n位=乘与2的n次方,所以在开发中用左移代替乘与2的n次方操作;

3.7.2 >>(右移)【右移几位就除与2的几次方】
高位为1,移动以后用1补充,否则用0补充
eg:-8
(1)、转为二进制,int(-8)转为二进制为
1111 1111 1111 1111 1111 1111 1111 1000
(2)、右移指定位数,eg1位,高位为1添1
1111 1111 1111 1111 1111 1111 1111 1100
(3)、转为十进制,结果为-4
右移n位=除2的n次方,所以在开发中用右移代替除2的n次方操作;
eg
这里写图片描述

3.7.3>>>(无符号右移)
无符号右移与右移差不多,不同之处是无论最高位是0还是1,全部用0填充
(1)取一个整数转为二进制,eg int(-8) 32位
1111 1111 1111 1111 1111 1111 1111 1000
(2)右移指定位数,eg1位,得到新的二进制数
0111 1111 1111 1111 1111 1111 1111 1100
(3)将二进制转为十进制,得到2147483644
代码验证
这里写图片描述
无符号右移时要注意,一个绝对值很小的负数,移动以后结果会成绝对值很大的整数,这在大多数情况下无意义。

3.7.4 令人困扰的例子
在java中,有时对移位运算底层操作机制不了解,会引发一些不必要的错误,eg:
这里写图片描述
这是因为在移位前,java系统首先把要移的位数与被移数的位数求余,然后移动余数位数,eg:本例中的32对32求余,64对64求余结果都为0,所以都没移动,把一个整数移动比他位数还多的位数是没有意义的。

3.8 赋值运算

java中两种赋值运算:普通赋值运算和运算赋值运算;
3.8.1 普通赋值运算
即”=“eg:

int i=23;//把值23赋给变量i

与其他语言稍不同的是,java语言的赋值运算有返回值,可以把”a=b“看做一个表达式(即:赋值表达式),其返回值就是b的值.
3.8.2 运算赋值运算
指:赋值的同时还可以进行其他运算,语法为 x op=y;
1、其中“op”指的是某种操作运算符,+,-,>>>
2、整个操作相当于”X=(

3.9 括号及运算符间优先级关系

运算符优先级,越靠上的优先级越高,同一行优先级相同
这里写图片描述

3.10 常用数学工具包——java.lang.Math类

java.lang.Math提供的方法用于帮助执行基本的数学函数计算。eg,三角函数,求随机数等
Math类的属性和方法都是静态的,并且Math 不能创建对象

3.10.1 数学常量
Math类提供了两个常用常量,都是double类型
1、Math.PI:圆周率
2、Math.E:自然常量
这里写图片描述

3.10.2 常用数学函数
1、abs()方法《absolute》
返回被操作数的绝对值,eg
这里写图片描述

2、ceil() 方法《返回double类型》
返回一个大于等于操作数的最近整数,eg:
这里写图片描述

3、floor() 方法
返回一个小于等于操作数的最近整数,eg:
这里写图片描述

4、max() 方法
返回两个操作数中较大一个

5、min() 方法
返回两个操作数中较小的一个

6、random() 方法
返回大于等于0.0并小于1.0的随机double型值,不带参数,eg
这里写图片描述
7、round() 方法
返回最接近操作数的整数(四舍五入),其算法是将操作数加上0.5,并截断,eg:
这里写图片描述
8、sin() 方法
返回给定角度的角的正弦,其操作数为double型,角用弧度表示,角度可以用Math.toRadians()转为弧度 eg:
9、cos() 方法<操作数为double类型,角度用弧度表示>
10、tan() 方法<操作数为double类型,角度用弧度表示>eg:
这里写图片描述
11、sqrt() 方法【sqrt:开平方根】
返回给定值平方根,操作数为double
这里写图片描述
12、toDegress() 方法
返回给定弧度的角度值eg:
这里写图片描述

 第三章完!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值