张小飞的Java之路-第四章

写在前面:

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

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

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



1. 表达式

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


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

张小飞:“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,怎么会这样子?”

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

“好的,好的”

2. %:取模运算

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

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

结果:


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

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

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

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

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


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

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

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

“哦...,明白了”


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

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

3. ++:自增运算符

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

上图中:a++ 相当于 a = a+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. &&

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

示例:

结果:

张小飞:“还得用 && 连起来,a

“不行,Java 中确实不允许a

“好吧”


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

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

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

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

2. ||

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

示例:

结果:

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

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

“明白,跟 && 很类似”

3.!(非)

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

示例:

结果:


5. 位运算符

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

张小飞:“。。。。。”

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

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

1. <<

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

示例:

结果:

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


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

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

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


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

2. >>

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

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

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


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


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

“右移 1 位的结果:”

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

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

3. >>>

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

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

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


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

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

4. &

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

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

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

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


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

示例:

结果:

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


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

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

5. |

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

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

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

示例:

结果:


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

“没问题,看我的”

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

“那,必须的”

6. ^

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


示例:

结果:


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

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

“过奖,过奖”


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

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

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

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

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

结果:


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

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

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

页面更新:2024-04-12

标签:被除数   除数   正数   除法   负数   赋值   表达式   师兄   代码   简单   张小飞

1 2 3 4 5

上滑加载更多 ↓
Top