张小飞的Java之路——第四章

Java基础,Java中的运算符
摘要由CSDN通过智能技术生成

写在前面:

视频是什么东西,有看文档精彩吗?

视频是什么东西,有看文档速度快吗?

视频是什么东西,有看文档效率高吗?


下午 2 点。诸小亮看着空荡荡的书房:“这小子,肯定又睡过了,不行,我得去找他”

来到张小飞的屋前,还没开口,就听到:

十、九、八、七、六、五、四、三、二、一….起床!
雷达跟踪正常
遥感信号正常

时钟显示正常
内衣穿着正常

身体方位正常
被子展开正常

现在开始分离程序

主体与床垫分离
……
继续分离
……
双脚脱离预定轨道

屁股脱离预定轨道
……

啊,失败!

诸小亮:。。。。。。。

1. 表达式

十分钟后,两人重新来到了书房。

诸小亮:“咱们继续上课,首先来认识一下 表达式

表达式:就是 数据的表达方式 
比如:int a = 2;那么 a 就是 2 的表达方式,所以 a 就是表达式

张小飞:“a 不应该是标识符吗?怎么又成表达式了”

“一样的意思,只是叫法不同而已,这样定义后,只要提到 a,我们就明白它代表的是 2 ”

“我明白了,这相当于给数字 2 起了个绰号”

“可以这样认为,但并不是很准确,因为下面的也是表达式:”

public static void main(String[] args){
    int a = 2;
    
    //数字3的表示方式有很多种,比如:
    a + 1;// a+1 可以表示 3 ,所以 a+3 也是表达式
    
    1 + 2;// 1+2 也可以表示 3,所以它也是表达式
}

诸小亮:“总之:只要能表示某个数据的代码,都是表达式

张小飞:“明白”

2. 运算符

诸小亮:“接着,我们说说 Java 中的运算符,毕竟计算机嘛,就是帮助人类做计算的”

张小飞:“不就是 加减乘除 嘛,这有什么说的”

“这你就不懂了,加减乘除只是最基本的,Java 中还有其他一些运算符,比如: %、++、-- 等,另外 Java 中的除法,跟我们平常中的除法也有点儿区别?”

“哦?这我倒是想见识一下,哪里不一样”

“不要着急,Java中的运算符分为好几种,我们一个一个说”

1. 算数运算符

1. + 、-、*、/

诸小亮:“咱们先看 算数运算符,其实就是: + 、-、*、/

public  static void main (String  []  args)  {
    int a = 1 + 2;
    
    int b = a - 2;
    
    int c = b * 3;
    
    int d = c / 3;
}

“由于代码太简单,结果我就不输出了,给你 2 分钟,你自己看看吧”

“师兄,您接着说吧,这么简单的东西,都不值得我动手”张小飞信心十足的说到

“好吧,上面的确实太简单,不过需要注意一点:除法运算,看下面代码:”

在这里插入图片描述

结果:

在这里插入图片描述

“这是什么情况,不应该输出 2.5 吗?”张小飞问到

“2.5 是数学上的结果,Java 中,整数之间做除法,结果中的小数部分会被舍弃

张小飞:“但是这样的结果不正确啊,怎么能够保留小数部分呢?”

诸小亮:“如果想保留小数部分,那么就只能:”

在这里插入图片描述

结果:

在这里插入图片描述

“哦,明白了,我自己来试试”

“师兄,我好奇尝试一下把除数弄成 0,怎么会这样子?”

image.png

image.png
“这表示程序出问题了,不过我们还没讲到这里,之后再说”

“好的,好的”

2. %:取模运算

张小飞:“这个 取模运算 是什么意思?”

诸小亮:“**其实就是两个数相除,获取余数,**比如:”

在这里插入图片描述

结果:

在这里插入图片描述

张小飞:“这个有点儿意思,我来试试”

“师兄,我用正数测试是没问题的,但是用负数的话。。。,结果:”

在这里插入图片描述

在这里插入图片描述

诸小亮:“这正是我要给你说的第二点:如果除数是负数,负号可以忽略不计

张小飞:“那,如果被除数是负数呢?我再来试试”

在这里插入图片描述

在这里插入图片描述

张小飞:“原来如此,如果被除数是负数,就不能忽略负号了”

诸小亮:“还有一种比较特殊的取模:**被除数 比 除数 小,**比如:”

在这里插入图片描述
在这里插入图片描述

张小飞:“这个怎么解释?”

诸小亮:“1 % 5,商是0,余数是1”

“哦…,明白了”

“还有一点需要记住:取模运算的结果,必然比除数小

“这是当然,余数嘛,肯定比除数小”

3. ++:自增运算符

诸小亮:“++运算符,表示自己加 1,比如:”

在这里插入图片描述

上图中:a++ 相当于 a = a+1,结果:

在这里插入图片描述

张小飞:“。。。。,我还以为是很高深的东西呢,就这?”

“你想多了,不过下面的就有些难度,比如:前置运算

“哦?什么是前置运算?”张小飞兴致勃勃的问到

“把 ++ 放到变量的前面,这就叫:**前置运算,**比如:”

image.png
“。。。。。。,你真无聊”

“哈哈,开个玩笑,下面的才真正能有难度,仔细看好:”

在这里插入图片描述

在这里插入图片描述

“师兄,感觉还需要您解释一下”

“没问题,其实上面代码的运算逻辑,实际是:”

  • 先执行 ++ 操作,所以 a = 2;
  • 然后把 a 的值赋给 b,所以 b = 2;

“明白,不过这也不难啊”

“稍等,让我变形一下”

在这里插入图片描述

在这里插入图片描述

“这…,怎么会这样呢?”张小飞疑惑道

“++ 放到变量后面,情况就不同了,这叫:**后置运算,**它的运算逻辑是这样的:”

  • 先临时记录 a 的值,比如:int temp = a;
  • 然后执行 ++ 操作,所以 a = 2;
  • 最后把 temp 赋给 b,所以 b = 1;

“原来如此,我明白了” 张小飞说到

4. --:自减运算

诸小亮:“–运算符,就是自己减 1,跟 ++ 类似,我就不介绍了,给你 5 分钟,自己玩玩吧”

张小飞:“好的”

2. 赋值运算符

五分钟后。

诸小亮:“接下来是 赋值运算”

张小飞:“师兄,赋值不就是 = 号吗,这还要单独讲?”

“赋值运算符也有好几个,= 只是其中一个,还有:+=, -=, *=, /=, %=,你看看下面代码:”

public static void main(String[] args){
    int a = 2;
    a += 3;//相当于 a = a + 3;
    a -= 1;//相当于 a = a - 3;
    a *= 2;//相当于 a = a * 3;
    a /= 2;//相当于 a = a / 3;
    a %= 5;//相当于 a = a % 3;
}

“原来还可以这样使用,我明白了”

“不过,需要注意,**a += 3 **跟 a = a + 3 还是有区别的,比如:”

在这里插入图片描述

“您是不是写错了,这个代码编译会报错,s+3 是一个 int 类型的值,无法赋值给 s ”

“你说的没错,但是改一下的话:”

在这里插入图片描述

“这时候就可以编译成功了,而且正常输出”

在这里插入图片描述

张小飞疑惑道:“这是为什么呢?”

“原因很简单:+= 是赋值运算符,如果两边的类型不一样时会自动向低转化,所以。。。。。”

“明白了”

3. 比较运算符

诸小亮:“比较运算符也有好几个:==、!=、>、>=、<、<=”

张小飞:“这个我知道,数学上也经常使用”

“没错,不过在 Java 中,比较运算符的结果都是 boolean 型,要么是true,要么是false,比如:”

public static void main(String[] args){
    boolean bool = 4 == 3;
    System.out.println(bool);
    System.out.println(4 != 3);
    System.out.println(4 > 3);
    System.out.println(4 >= 3);
    System.out.println(4 < 3);
    System.out.println(4 <= 3);
}

结果:

在这里插入图片描述

“这个比较简单,也没什么特殊的地方,看看就行”

“好的”

4. 逻辑运算符

诸小亮:“逻辑运算符,这个就复杂一些了”

张小飞:“师兄,你上面就说有难度,最后也没发现难在哪儿了,别再忽悠了”

“咳咳,我说有难度了吗,我说的是:它稍微复杂一些”诸小亮反驳道

“好好,是我听错了,您接着说”

“逻辑运算符,有 3 个:&&(且)、||(或)、!(非),咱们一个个解释”

1. &&

诸小亮:“第一个:&&(且)”

作用:连接两个表达式,两个表达式都为 true,结果才为 true,否则为 false

示例:

在这里插入图片描述

结果:

在这里插入图片描述

张小飞:“还得用 && 连起来,a<b<c 这样写不行吗?”

“不行,Java 中确实不允许a<b<c 这种写法 ”

“好吧”

“另外,还需要注意:使用 && 时,只要第一个表达式的值是false,那么整体就是false

  • 上面的代码:c < a && a < b,第一个c < a 是 false,所以整个表达式的值就是false
  • 后面 a < c 不会继续判断,也就是 a<c 这个代码不会执行

“这个,可以证明一下吗?”

“当然可以,修改一下代码:”

在这里插入图片描述

在这里插入图片描述

张小飞:“原来如此, 如果 a / 0 执行的话,就会报错了”

2. ||

诸小亮:“第二个:||(或)”

作用:连接两个表达式,两个表达式只要有一个 true,结果就为 true

示例:

在这里插入图片描述

结果:

在这里插入图片描述

“这等于跟 && 刚好相反嘛”张小飞说到

“是的,不过:如果第一个表达式结果为true,整体结果就为true,不用再执行第二个表达式

“明白,跟 && 很类似”

3.!(非)

诸小亮:“第三个:!(非),这个更简单”

作用:对表达式的值取反,如果表达式的值是true,取反后,结果就是:false

示例:

在这里插入图片描述

结果:

在这里插入图片描述

5. 位运算符

诸小亮:“师弟,下面我们讲位运算,这个是真有难度”

张小飞:“。。。。。”

“你不信?好,我们来看看,位运算:直接数据对二进制进行运算”

“二进制运算?什么意思?”

1. <<

诸小亮:“<<:左移一个数左移 N 位,相当于乘以 2 的 N 次方

示例:

在这里插入图片描述

结果:

在这里插入图片描述

张小飞:“这个二进制又有什么关系呢?”

“很简单,我们先看数字 1 的二进制:”
image.png

“左移 1 位,就是把所有二进制向左边移动一个位置,结果:”
image.png

“这样,左边最高位的 0 就会超出 int 的边界,也就舍弃掉了,不过最右边也会出现一个空位,这时补 0,最后结果:”
image.png

张小飞:“原来是这样,我明白了”

2. >>

诸小亮:“然后是 >> (右移)一个数右移 N 位,相当于除以 2 的 N 次方

张小飞:“明白,右移跟左移刚好相反”

“是的,不过在右移后,左边会出现空位,这时:”

  • 如果是正数:左边补0
  • 如果是负数:左边补1

“师兄,不对啊,为什么我这个右移后结果是0呢?”
image.png

image.png

诸小亮微微一笑:“我们再来回忆一下,1 的二进制”

image.png

“右移 1 位的结果:”
image.png

因为是正数,所以左侧补 0 ,最终结果:
image.png
张小飞:“原来如此,懂了懂了”

3. >>>

张小飞:“师兄,>>> 这个也是右移?”

诸小亮:“是的,这个确实也是右移,不过。。。”

“是不是右移 N 位,就相当于除以 3 的 N 次方? ”张小飞抢答道

“。。。。,不是的,它的含义是:>>>:无符号右移,不管是正数、负数,右移后,左边统统补0

“师弟,这个我就不详细介绍了,你自己玩吧”

4. &

诸小亮:“接下来是 & (按位与)运算”

张小飞:“这不是 ‘且’ 吗,怎么又叫 ‘按位与’ 了?”

“。。。,你仔细看清楚,且是 ‘&&’,这里是 ‘&’

“哦哦,不好意思,看错了,那这个具体是什么意思?”

“也是对二进制做运算,规则是:相同位置都是1,那么结果就为1,否则为0

示例:

image.png

结果:
image.png
“这个,嗯。。。,还得麻烦您解释一下”张小飞说到

“怎么样,不是那么简单吧,给你个图,先看看”
image.png

“明白了,关键就在于:相同位置都是1,那么结果就为1,否则为0

5. |

诸小亮:“师弟,这个要看清楚了,是 ‘|(按位或)’,可不是 ‘||’”

张小飞:“。。。,好啦好啦,这次看清了,赶紧说说是什么意思吧”

“对二进制做 运算,规则:相同位置均为0,那么结果就为0,否则为1

示例:

image.png

结果:
image.png

“师弟,这个你能单独画张图,解释一下吗?”

“没问题,看我的”
image.png
“嗯嗯,没错没错,看来你已经掌握精髓了”

“那,必须的”

6. ^

诸小亮:“最后一个:^(异或),规则:相同位置的值不同,那么结果就为1,否则为0

示例:

在这里插入图片描述

结果:

在这里插入图片描述

“师兄,这个还交给我,你看看”

image.png
“完全正确,简直不要太棒”诸小亮赞扬到

“过奖,过奖”

“下面给你说一个场景,使用 ^ 很方便,面试也有人问”

“哦?什么场景?”张小飞一下来了兴致

“比如:交换两个变量的值,你觉得应该怎么做?”

“这太简单了,代码应该是:”

public  static void main (String  []  args)  {
    int a = 2;
    int b = 3;
    
    //交换 a 和 b 的值
    int temp = a;
    a = b;
    b = temp;
    System.out.println(a + "," +b);
}

结果:

在这里插入图片描述

“嗯,没错,你这样确实能实现,但是使用 ^ 会更加简单,比如:”

在这里插入图片描述

结果:

在这里插入图片描述

“这就交换成功了?不是吧”
“没错,这就是 ^ 的强大之处,你根据之前的知识,好好研究一下吧,给你个提示:”

  • 一个数 异或 同一个数 两次,那么结果是它本身

“好的,好的,我这就看看”

6. 三元运算符

诸小亮:“来,还剩下最有一个运算符:三元运算符”

张小飞:“这又是什么东西?”

“非常简单,格式:(条件表达式) ? 结果1:结果2;

“额…,不懂” 张小飞摇摇头

“没关系,看一段代码你就明白了”

public  static void main (String  []  args)  {
    int a = 2;
    int b = 3;
    
    //三元运算:如果 a<b 的结果是 true, 则设置 c 为100,否则设置为200
    int c = a < b ? 100 : 200;
    System.out.println(c);
}

结果:

image.png

“师兄,我是这样理解的:如果条件表达式的结果为 ture,那么就取 结果1,否则取 结果2

“没错,是这样的,那么关于运算符就这么多了,需要练习一会儿吗?”

“当然了,这个东西还是挺多了”

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值