【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);
}
}
编译后运行,得到结果如图所示:

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

值得注意的是,默认情况下,计算后的结果的数据类型为整型,但计算时变量数据类型高于整型时,则输出结果为最高级数据类型,以前文给出的例子为例:
System.out.println(a+b+c+d+e); //Long
System.out.println(a+b+d+e); //int

从上图可知,四则运算结果默认为整型,而编译后运行结果(分割线下)则体现了上文中 “以参与运算的变量最高数据类型输出”。
1-5.1.2 扩展赋值运算符
扩展赋值运算符是一种赋值时的简易写法。如:
a+=b //即 a = a + b
a-=b //即 a = a - b
在执行输出语句时,+既可以作字符串连接符,也可以作算术运算符,但若+跟在字符串后,则在不加任何优先级时,其后所有变量都将转换为字符串,并将字符串内容连接。如:

1-5.1.3 模运算
Java 中的模运算,即数学当中的取余。a % b(a 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);
}
}
编译后运行,得到如图所示结果:

当自增自减运算符在后时,先执行代码,后自增 / 自减;当自增自减运算符在前时,先自增 / 自减,后执行代码。
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("==============");
}
}
编译后运行,得到如图所示结果:

1-5.2 关系运算符
关系运算符判断关系是成立与否后,输出的结果为布尔值,有两种结果:true或false。
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);
}
}
编译后运行,得到结果如图所示:

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))); //取反:真时得假,假时得真
}
}
编译后运行,得到结果如图所示:

其中,+起到连接字符串的作用,是字符串连接符。
在运用逻辑运算符时,有一个特性值得我们注意。请看下面例子:
int c = 5;
boolean d = (c<4) && (c++<4); //结果一定为 false
System.out.println(c); //变量 c 的值没有发生变化:短路运算
System.out.println(d);
编译后运行,得到如图所示结果:

解释:在上述例子中,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并查看结果:

有关计算机是如何进行四则运算的,请见下方扩展与补充。
1-5.5 条件运算符
条件运算符用法:x ? y : z
上述语句意思为:若变量x为true,则执行y,否则执行z,这是一个三元运算符。
请看例子:

1-5.6 扩展与补充
1-5.6.1 原码、反码和补码
简单来说,正数的原码、补码和反码皆为其自身的二进制表示。而负数的在机器中的表示为其补码,补码是在其反码的基础上 + 1所得,而反码是其原码的基础上,最高位符号位不变,其余位全部取反所得。
至于为什么要如此定义,以及这么定义有什么优势和好处,请见下方链接。
详细内容请参见:原码, 反码, 补码 详解
作者:张子秋
出处:https://www.cnblogs.com/zhangziqiu
1-5.6.2 计算机中乘除法运算规则
在计算机中,所有的数都是以二进制机器数表示。而在计算机中,只有加法,原码、反码和补码解决了数的加减法问题,那么计算机是如何实现乘除法的呢?
浙公网安备 33010602011771号