欢迎光临散文网 会员登陆 & 注册

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

2023-03-19 17:11 作者:bili_32311085394  | 我要投稿

写在前面:

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

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

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


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


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

诸小亮:。。。。。。。

1. 表达式

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


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

表达式:就是 数据的表达方式 

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

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

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


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


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


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


张小飞:“明白”

2. 运算符

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


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


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


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


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

1. 算数运算符

1. + 、-、*、/

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

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


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


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

结果:

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


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


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


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

结果:

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

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

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


“好的,好的”

2. %:取模运算

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


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

结果:

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


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

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


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

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


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

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


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


“哦...,明白了”


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


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

3. ++:自增运算符

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

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

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


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


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


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

“。。。。。。,你真无聊”

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

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


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

  • 先执行 ++ 操作,所以 a = 2;

  • 然后把 a 的值赋给 b,所以 b = 2;

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

“稍等,让我变形一下”

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


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

  • 先临时记录 a 的值,比如:int temp = a;

  • 然后执行 ++ 操作,所以 a = 2;

  • 最后把 temp 赋给 b,所以 b = 1;

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

4. --:自减运算

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


张小飞:“好的”

2. 赋值运算符

五分钟后。


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


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

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

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

“不过,需要明白,a += 3 a = a + 3 还是有区别的,比如:”

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


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

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

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


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


“明白”

3. 比较运算符

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


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

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


结果:

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

“好的”

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 的二进制:”

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

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

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

2. >>

诸小亮:“然后是 >> (右移)”

>>:右移,一个数右移 N 位,相当于除以 2 的 N 次方

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

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

  • 如果是正数:左边补0

  • 如果是负数:左边补1


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


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

“右移 1 位的结果:”

因为是正数,所以左侧补 0 ,最终结果:

张小飞:“原来如此,懂了懂了”

3. >>>

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


诸小亮:“是的,这个右移。。。”


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

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


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

4. &

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


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


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


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


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

示例:

结果:

“这个,嗯。。。,还得麻烦您解释一下”张小飞说到

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

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

5. |

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


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

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

示例:

结果:

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


“没问题,看我的”

“嗯嗯,没错没错,看来你已经掌握精髓了”

“那,必须的”

6. ^

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


示例:

结果:


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

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

“过奖,过奖”

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


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


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


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

结果:


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



结果:


“这就交换成功了?不是吧”


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

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

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


6. 三元运算符

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


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

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


“嗯....,不懂”张小飞摇摇头


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

结果:


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


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


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


张小飞的Java之路——第四章的评论 (共 条)

分享到微博请遵守国家法律