【Java基础笔记】1-5 运算符

§1-5 运算符

Java 语言支持如下运算符:

  • 算术运算符:+, -, *, /, %, ++, --
  • 赋值运算符:=
  • 关系运算符:>, <, >=, <=, ==, !=, instanceof
  • 逻辑运算符:&&, ||, !
  • 位运算符:&, |, ^, ~, >>, <<, >>>
  • 条件运算符:?, :
  • 扩展赋值运算符:+=, -=, *=, /=

不同运算符所执行的运算有优先级之分,若要强调优先级,可用()括住该运算。

1-5.1 算术运算符

1-5.1.1 四则运算

数学中的加减乘除四则运算在 Java 中也支持,请看下面的例子:

public class Operators {
    public static void main(String[] args) {
        //二元运算符
        int a = 10;
        int b = 20;
        long c = 123123123123123L;
        byte d = 120;
        short e = 8;
        
        System.out.println(a+b);
        System.out.println(a-b);
        System.out.println(a*b);
        System.out.println(a/b);
    }
}

编译后运行,得到结果如图所示:

image

可见在运算a/b时,结果本应带有小数,却因为计算结果的数据类型为int而自动舍弃小数,为避免这种情况发生,可在计算时强制转换数据类型,见下:

		System.out.println(a/(double)b);

image

值得注意的是,默认情况下,计算后的结果的数据类型为整型,但计算时变量数据类型高于整型时,则输出结果为最高级数据类型,以前文给出的例子为例:

		System.out.println(a+b+c+d+e);	//Long
		System.out.println(a+b+d+e);	//int

image

从上图可知,四则运算结果默认为整型,而编译后运行结果(分割线下)则体现了上文中 “以参与运算的变量最高数据类型输出”。

1-5.1.2 扩展赋值运算符

扩展赋值运算符是一种赋值时的简易写法。如:

a+=b	//即 a = a + b
a-=b	//即 a = a - b

在执行输出语句时,+既可以作字符串连接符,也可以作算术运算符,但若+跟在字符串后,则在不加任何优先级时,其后所有变量都将转换为字符串,并将字符串内容连接。如:

image

1-5.1.3 模运算

Java 中的模运算,即数学当中的取余。a % ba b皆为整型)意为a / b后取其余数,数据类型为整型。

1-5.1.4 自增自减运算符

在前文我们有提到算数运算符中还有++ --这两个运算符,它们是自增则减运算符,使用时,a++a = a + 1;同理,a--a = a - 1。但值得注意的是,自增自减运算符的位置不同,它们的执行时机也不同。

public class SelfOps {
    public static void main(String[] args) {
        //自增自减运算符为一元运算符
        int a = 3;
        
        int b = a++;
        System.out.println(a);
        System.out.println(b);
        
        int c = ++a;
        System.out.println(a);
        System.out.println(c);
    }
}

编译后运行,得到如图所示结果:

image

当自增自减运算符在后时,先执行代码,后自增 / 自减;当自增自减运算符在前时,先自增 / 自减,后执行代码。

1-5.1.5 其他数学运算

若要对一个数作幂运算、求绝对值等较为复杂的数学运算时,我们需要借助一些工具实现它:Math。快捷输入方式:Math.<运算名>(表达式参数)

public class Maths {
    public static void main(String[] args) {
		//Math
        double pow = Math.pow(2, 3);
        System.out.println(pow);
        System.out.println("==============");

        int abs = Math.abs(-127);
        System.out.println(abs);
        System.out.println("==============");

        double sin = Math.sin(3.14);
        System.out.println(sin);
        System.out.println("==============");
    }
}

编译后运行,得到如图所示结果:

image

1-5.2 关系运算符

关系运算符判断关系是成立与否后,输出的结果为布尔值,有两种结果:truefalse

public class RelationalOps {
    public static void main(String[] args) {
        //判断结果输出为布尔值
        int a = 10;
        int b = 20;
        
        //输出比较
        System.out.println(a>b);
        System.out.println(a<b);
        System.out.println(a==b);
        System.out.println(a!=b);
    }
}

编译后运行,得到结果如图所示:

image

1-5.3 逻辑运算符

Java 语言中支持如下逻辑运算符:与(and, &&)、或(or, ||)、非(not, !)

请看下方的例子:

public class LogicalOps {
    public static void main(String[] args) {
        //逻辑运算符
        boolean a = true;
        boolean b = false;

        //输出结果:逻辑运算
        System.out.println("a && b :"+(a && b));    //与运算:同真才为真
        System.out.println("a || b :"+(a || b));    //或运算:有一真为真,同假为假
        System.out.println("!( a && b ): "+(!(a && b)));    //取反:真时得假,假时得真
    }
}

编译后运行,得到结果如图所示:

image

其中,+起到连接字符串的作用,是字符串连接符

在运用逻辑运算符时,有一个特性值得我们注意。请看下面例子:

		int c = 5;
        boolean d = (c<4) && (c++<4);   //结果一定为 false
        System.out.println(c);  //变量 c 的值没有发生变化:短路运算
        System.out.println(d);

编译后运行,得到如图所示结果:

image

解释:在上述例子中,d永远为false,因为其表达的与运算中的第一个条件c<4已经为false,则整条式子计算后结果为false。此时,与运算符后的条件c++<4没有执行,被跳过,因而该计算被 “短路” ,c的结果仍为5。

:短路计算常用于与运算中。

1.5.4 位运算符

Java 中有如下常见位运算符:& | ^ ~,左移右移运算符<< >>(仅用于整型)。

其意义见下:

/*
	A = 0011 1100
	B = 0000 1101
	==========================
	
	位运算符:
	
	A & B = 0000 1100	类似于与运算,相同位都为1时才取1(同真为真,其余为假)
	A | B = 0011 1101	类似于或运算,相同位有1取1(有一真为真,同假取假)
	A ^ B = 0011 0001	异或运算,相同位相同为0,不同取1(同假异真)
	~ B = 	1111 0010	取反,依次按位取反
	==========================
	
	左移右移运算符:
	思考一个问题:2 * 8 如何计算效率最高?
	
	在二进制中:
	2 = 0000 0010
	3 = 0000 0011
	4 = 0000 0100
	8 = 0000 1000
	16= 0001 0000
	
	2 * 8 = 2 * 2 * 2 * 2 = 2 << 3 = 16
	可如此简单理解:
        a << b = a * (2^b)
        a >> b = a / (2^b)
*/

我们可以尝试2 << 3并查看结果:

image

有关计算机是如何进行四则运算的,请见下方扩展与补充

1-5.5 条件运算符

条件运算符用法x ? y : z

上述语句意思为:若变量xtrue,则执行y,否则执行z,这是一个三元运算符。

请看例子:

image

1-5.6 扩展与补充

1-5.6.1 原码、反码和补码

简单来说,正数的原码、补码和反码皆为其自身的二进制表示。而负数的在机器中的表示为其补码,补码是在其反码的基础上 + 1所得,而反码是其原码的基础上,最高位符号位不变,其余位全部取反所得。

至于为什么要如此定义,以及这么定义有什么优势和好处,请见下方链接。

详细内容请参见:原码, 反码, 补码 详解

作者:张子秋

出处:https://www.cnblogs.com/zhangziqiu

1-5.6.2 计算机中乘除法运算规则

在计算机中,所有的数都是以二进制机器数表示。而在计算机中,只有加法,原码、反码和补码解决了数的加减法问题,那么计算机是如何实现乘除法的呢?

详细内容请参见:计算机实现乘法和除法的运算规则 - stigerzergold - 博客园 (cnblogs.com)

作者:stigerzergold

出处:https://www.cnblogs.com/stigerzergold/p/10328472.html

posted @ 2021-07-11 10:33  Zebt  阅读(153)  评论(0)    收藏  举报