6_JAVA算数运算符+细节问题

算数运算符

符号说明
+
-
*
/
%求余/取模

整数除以整数一定是整数,例如3/2=1,余数1除不了2被省略

%表示取模,即拿运算结果的余数,列入4%3=1

%符号问题,结果永远与被除数一致,可以理解为表达式的左边

请添加图片描述

关系运算符

符号说明
>大于
<小于
>=大于或等于
<=大于或小于
==等于
!=不等于

注意上述关系运算符只适用于八个基本数据类型,不适用于字符串类型

字符串类型有专门的的比较方法,即equals(),验证两个字符串是否相等

关系运算符的运算结果都是布尔值

!表示 非/取反

运算符的优先级

优先级运算符结合性
1()、[]、{}从左向右
2!、+、-、~、++、–从右向左
3*、/、%从左向右
4+、-从左向右
5«、»、>>>从左向右
6<、<=、>、>=、instanceof从左向右
7==、!=从左向右
8&从左向右
9^从左向右
10|从左向右
11&&从左向右
12||从左向右
13?:从右向左
14=、+=、-=、*=、/=、&=、|=、^=、~=、«=、»=、>>>=从右向左

遇到优先级问题不知道怎么判断,可以加小括号防止

例如:(3%5)+3 > 7-(5/6)

案例

输入个三位数,求各个位数的和

int num = 123;
int geWei = num%10;
int shiWei = num/10%10;
int baiWei = num/100;

int sum = geWei + shiWei + baiWei

规律如下:

输入个五位数,求各个位数的和

int num = 12345;
int geWei     = num  /1        %10;
int shiWei    = num  /10       %10;
int baiWei    = num  /100      %10;
int qianWei   = num  /1000     %10;
int wanWei    = num  /10000    %10;

int sum = geWei + shiWei + baiWei + qianWei + wanWei

通项:num/num所在位的最小值%10

两个数交换

一般初学者的做法

int a = 15int b = 10;
a = b;
b = a;

//此时 a=10,b=10,自己理解!!!

方法一 通过临时中间变量

实际上一般防止这种赋值导致的值丢失的问题,我们会借助一个临时中间变量来进行临时的值存储

int a = 15;
int b = 10;
int c = a;
a = b;
b = c;

方法二 通过数学运算(不推荐)

我们也可以通过数学的加减来操作,但一般不建议,因为数据都有取值范围,如果进行相加相减,可能会导致数据的范围溢出

a = a + b;  //25
b = a - b;	//15
a = a - b;  //10

数据的范围溢出示例:
请添加图片描述

最大值加一变成最小值。最小值减一变成最大值

方法三 位运算(效率最高)

位运算实际上就是二进制的运算

a = a ^ b;  
b = a ^ b;	
a = a ^ b;  

请添加图片描述

逻辑运算符

在这里插入图片描述

System.out.println(2<1 && 1/0==0);  //false
System.out.println(2>1 || 1/0==0);	//true
System.out.println(2<1 & 1/0==0);  
System.out.println(2>1 | 1/0==0);	

//报错
//Exception in thread "main" java.lang.ArithmeticException: / by zero
//算数异常 来自0

两个符号的逻辑运算符&&||会根据真值表判断(短路特性

像案例里的 &&当其验证第一个表达式为false时,则会发生短路效应直接跳过第二个验证,返回false

||当其验证第一个表达式为true时,则会发生短路效应直接跳过第二个验证,返回true

所有&&被称作为短路与||被称作为短路非

逻辑与逻辑非根据真值表验证,当验证一半觉得没必要再验证的时候,直接略过后续的验证,返回最终结果

一个符号则前后两个都要验证,当验证表达式除数为0,则直接报错

细节一

a = a + 2;
//等价于
a += 2;

右边a 左边也有,则可以省略不写,直接将+号放=即可

面试题

int a = 15;
a =+ 10;
//请问:a等于多少

结果:a为10,应为 a=+10表示将右边的正10 (+10)赋值给左边的a,平时正号都是省略不写,所以容易忽视,以此也可以理解为什么要将+=+放前面去

细节二

自增/自减说明
i++自增1,先用后增
++i自增1,先增后用
i–自减1,先用后减
–i自减1,先减后用
int a = 10;
System.out.println(a++); //10
System.out.println(a);	 //11
int a = 10;
System.out.println(a++);//10
System.out.println(a++);//11
int a = 10;
System.out.println(++a); //11
System.out.println(a);  //11

细节三

对于整数来说只含有时 = +=具有内置转换器

byte a = 10//int
float b = 123.4; //报错,浮点类型默认为double,大的数据类型转小的数据类型需要强制转换
float b = 123.4f;
byte b1 = 100;
byte b2 = 100;
b2 = b1 = b2;//报错

请添加图片描述

特例:对于小于int整数情况(byteshort),运算结果不为数据类型本身,而是int类型,即 byte+byte/short+short -----》int

所以一般需要强制转换

b2 = (byte)(b1 + b2);

上述的+=由于内置转换器,所以下述案例不会报错

byte b1 = 100;
byte b2 = 100;
b2 += b1;

虽然b2 += b1类似于b2 = b1 + b2,但第一个表达式由于整数 含有+=会有内置转换器将其转换,第二个表示除了=还具有+所以不具有内置转换器的属性

只有short和char具有这种特例

字符串判断相等:equals()

字符串判断不相等:!equals()

String a = "abc";
String b = "abc";
System.out.println(a.equals(b)); //true  判断a、b是否相等
System.out.println(!a.equals(b)); //false 判断a、b是否不相等

//有些情况
System.out.println(a==b);//true
//结果好像也对,但这关系到类和对象的引用问题,后续会说明,不建议字符串使用这种方法来进行验证

三目运算符

min=(a<b)?a:b;

其中"(a<b)?a:b"是一个"条件表达式",它是这样执行的:如果a<b为真,则表达式取a值,否则取b值.

条件运算符由两个符号组成"?“和”:", 要求有3个操作对象,所以也叫它三目运算符

语法

parp = 布尔值?如果为true赋值此结果:如果为false赋值此结果

细节四:

在这里插入图片描述

表层原因floatint都是32bit

int的范围能够容纳下2的32次方个数字

float的小数,单0到1之间就有无穷小个数字,因此2的32次方个位置无法容纳全部小数

深层原因: 计算机是二进制

任何整数都是可以用2的各个次方和/差表示,例如整数5可以表示为22+21=5,整数7可以表示为23-21=7

但小数无法完美使用2的各个次方和/差表示

具体解决过程后续的包装类会再具体解决

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CNsurly

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值