《Java编程的逻辑笔记3》--基本运算

作者: 天一方蓝 | 来源:发表于2019-05-13 23:18 被阅读0次
    基本运算.PNG

    算术运算

    算术运算符有加减乘除,符号分别是+-*/,另外还有取模运算符%,以及自增(++)和自减(–)运算符。取模运算适用于整数和字符类型,其他算术运算适用于所有数值类型和字符类型,其他都符合常识,但字符类型看上去比较奇怪,后续文章解释。

    减号(-)通常用于两个数相减, 但也可以放在一个数前面,例如 -a, 这表示改变a的符号,原来的正数会变为负数,原来的负数会变为正数,这也是符合我们常识的。

    取模(%)就是数学中的求余数,例如,5%3是2,10%5是0。

    自增(++)和自减(--),是一种快捷方式,是对自己进行加一或减一操作。

    加减乘除注意事项
    运算时要注意结果的范围,使用恰当的数据类型。两个正数都可以用int表示,但相乘的结果可能就会超,超出后结果会令人困惑,例如:

    int a = 2147483647*2; // 2147483647是int能表示的最大值

    a的结果是-2。
    需要将至少一个数据表示为long形式,即在后面加L或l,下面这样才会出现期望的结果:
    long a = 21474836472L;
    另外,需要注意的是,整数相除不是四舍五入,而是直接舍去小数位,例如:
    double d = 10/4;
    结果是2而不是2.5,如果要按小数进行运算,需要将至少一个数表示为小数形式,或者使用强制类型转化,即在数字前面加(double),表示将数字看做double类型,如下所示任意一种形式都可以:
    double d = 10/4.0;
    double d = 10/(double)4;
    以上一些注意事项,我想也没什么特别的理由,大概是方便语言设计者实现语言吧。
    小数计算结果不精确
    无论是使用float还是double,进行运算时都会出现一些非常令人困惑的现象,比如:
    float f = 0.1f
    0.1f;
    System.out.println(f);
    这个结果看上去,不言而喻,应该是0.01,但实际上,屏幕输出却是0.010000001,后面多了个1。换用double看看:
    double d = 0.1*0.1;
    System.out.println(d);
    屏幕输出0.010000000000000002,一连串的0之后多了个2,结果也不精确。
    这是怎么回事?看上去这么简单的运算,计算机怎么能计算不精确呢?但事实就是这样,究其原因,我们需要理解float和double的二进制表示,后续文章进行分析。
    自增(++)/自减(--)
    自增/自减是对自己做加一和减一操作,但每个都有两种形式,一种是放在变量后,例如a++, a--,另一种是放在变量前,例如++a, --a。

    如果只是对自己操作,这两种形式也没什么差别,区别在于还有其他操作的时候。放在变量后(a++),是先用原来的值进行其他操作,然后再对自己做修改,而放在变量前(++a),是先对自己做修改,再用修改后的值进行其他操作。例如,快捷运算和其等同的运算分别是:

    image.png

    比较运算

    比较运算就是计算两个值之间的关系,结果是一个布尔类型(boolean)的值。比较运算适用于所有数值类型和字符类型。数值类型容易理解,但字符怎么比呢?后续文章解释。

    比较操作符有:大于(>),大于等于(>=),小于(<),小于等于(<=),等于(==),不等于(!=)。

    大部分也都是比较直观的,需要注意的是等于。
    首先,它使用两个等号==,而不是一个等号(=),为什么不用一个等号呢?因为一个等号(=)已经被占了,表示赋值操作。
    另外,对于数组,==判断的是两个数组是不是同一个数组,而不是两个数组的元素内容是否一样,即使两个数组的内容是一样的,但如果是两个不同的数组,==依然会返回false,如下所示:
    int[] a = new int[] {1,2,3};
    int[] b = new int[] {1,2,3};
    // a==b的结果是false
    如果需要比较数组的内容是否一样,需要逐个比较里面存储的每个元素。

    逻辑运算

    逻辑运算根据数据的逻辑关系,生成一个布尔值true或者false。逻辑运算只可应用于boolean类型的数据,但比较运算的结果是布尔值,所以其他类型数据的比较结果可进行逻辑运算。

    逻辑运算符具体有:
    与(&):两个都为true才是true,只要有一个是false就是false
    或(|):只要有一个为true就是true,都是false才是false
    非(!):针对一个变量,true会变成false, false会变成true
    异或(^):两个相同为false, 两个不相同为true
    短路与(&&): 和&类似,不同之处马上解释
    短路或 (||):与|类似,不同之处马上解释
    逻辑运算的大部分都是比较直观的,需要注意的是&和&&,以及|和||的区别。如果只是进行逻辑运算,它们也都是相同的,区别在于同时有其他操作的情况下,例如:
    boolean a = true;
    int b = 0;
    boolean flag = a | b++>0;
    因为a为true,所以flag也为true,但b的结果为1,因为|后面的式子也会进行运算,即使只看a已经知道flag的结果,还是会进行后面的运算。而||则不同,如果最后一句的代码是:
    boolean flag = a || b++>0;
    则b的值还是0,因为||会"短路",即在看到||前面部分就可以判定结果的情况下,忽略||后面的运算。

    相关文章

      网友评论

        本文标题:《Java编程的逻辑笔记3》--基本运算

        本文链接:https://www.haomeiwen.com/subject/jmjdaqtx.html