目录
1. 什么是运算符
在Java中,运算符是一些特殊的符号,用于进行各种数学计算和逻辑判断。它们让我们可以对数据进行加减乘除等操作,比较大小,或者将一个值赋给变量。
举个例子,假设我们有两个数字变量a和b,我们可以使用加法运算符(+)将它们相加,使用减法运算符(-)将它们相减,使用乘法运算符(*)将它们相乘,使用除法运算符(/)将它们相除。如果我们想知道a是否等于b,我们可以使用等于运算符(==)进行比较。还有其他的运算符可以帮助我们在程序中做更多的操作。
总之,运算符就是一种特殊的符号,用于进行各种数学和逻辑计算,方便我们在程序中进行各种操作。
2. 算术运算符
算术运算符是用于执行基本数学运算的符号。在Java中,常用的算术运算符包括加法(+)、减法(-)、乘法(*)、除法(/)、求余数(%)和自增(++)自减(--)。下面对这些算术运算符进行详细介绍:
-
加法(+):
- 用于将两个数相加,或连接两个字符串。
- 若操作数中至少有一个为字符串,则执行字符串连接操作;若操作数均为数值,则执行数值相加操作。
-
减法(-):
- 用于将第一个数减去第二个数。
- 执行数值相减操作。
-
乘法(*):
- 用于将两个数相乘。
- 执行数值相乘操作。
-
除法(/):
- 用于将第一个数除以第二个数。
- 若两个操作数都为整数,则执行整数除法,结果为整数部分;若至少有一个操作数为浮点数,则执行浮点数除法,结果为浮点数。
-
求余数(%):
- 用于求第一个数除以第二个数的余数。
- 只适用于整数操作数。
-
自增(++):
- 用于将操作数的值加1。
- 前置自增:++i,先将i的值加1,再返回增加后的值。
- 后置自增:i++,先返回i的值,再将i的值加1。
-
自减(--):
- 用于将操作数的值减1。
- 前置自减:--i,先将i的值减1,再返回减少后的值。
- 后置自减:i--,先返回i的值,再将i的值减1。
以下是算术运算符的代码示例:
int a = 10;
int b = 3;
int sum = a + b; // 加法
int difference = a - b; // 减法
int product = a * b; // 乘法
int quotient = a / b; // 除法
int remainder = a % b; // 求余数
System.out.println("Sum: " + sum);
System.out.println("Difference: " + difference);
System.out.println("Product: " + product);
System.out.println("Quotient: " + quotient);
System.out.println("Remainder: " + remainder);
int i = 5;
int preIncrement = ++i; // 前置自增
int j = 10;
int postIncrement = j++; // 后置自增
System.out.println("Pre Increment: " + preIncrement);
System.out.println("Post Increment: " + postIncrement);
运行程序输出如下:
在示例中,变量a和b分别代表操作数,通过算术运算符进行相应的运算,并将结果输出。最后,通过自增运算符对i和j进行自增操作,输出自增后的值。
3. 关系运算符
关系运算符用于比较两个值之间的关系,并返回一个布尔值(true或false)。在Java中,常用的关系运算符有以下几种:
-
等于(==):
- 用于判断两个操作数是否相等。
- 若两个操作数的值相等,则返回true;否则返回false。
-
不等于(!=):
- 用于判断两个操作数是否不相等。
- 若两个操作数的值不相等,则返回true;否则返回false。
-
大于(>):
- 用于判断第一个操作数是否大于第二个操作数。
- 若第一个操作数的值大于第二个操作数的值,则返回true;否则返回false。
-
小于(<):
- 用于判断第一个操作数是否小于第二个操作数。
- 若第一个操作数的值小于第二个操作数的值,则返回true;否则返回false。
-
大于等于(>=):
- 用于判断第一个操作数是否大于等于第二个操作数。
- 若第一个操作数的值大于等于第二个操作数的值,则返回true;否则返回false。
-
小于等于(<=):
- 用于判断第一个操作数是否小于等于第二个操作数。
- 若第一个操作数的值小于等于第二个操作数的值,则返回true;否则返回false。
关系运算符可以应用于数值类型(byte、short、int、long、float、double),字符类型(char)以及布尔类型(boolean)。
例如,下面是一些使用关系运算符的例子:
int a = 5;
int b = 10;
boolean isEqual = (a == b); // 等于运算,isEqual的值为false
boolean isNotEqual = (a != b); // 不等于运算,isNotEqual的值为true
boolean isGreater = (a > b); // 大于运算,isGreater的值为false
boolean isLess = (a < b); // 小于运算,isLess的值为true
boolean isGreaterOrEqual = (a >= b); // 大于等于运算,isGreaterOrEqual的值为false
boolean isLessOrEqual = (a <= b); // 小于等于运算,isLessOrEqual的值为true
需要注意的是,布尔类型的操作数只能进行等于运算符和不等于运算符的比较。另外,字符串类型也可以使用等于运算符和不等于运算符进行比较,判断两个字符串是否相等。
4. 逻辑运算符
逻辑运算符是用于在条件判断和布尔运算中进行逻辑运算的特殊符号。在Java中,常用的逻辑运算符有短路逻辑与(&&)、短路逻辑或(||)、逻辑与(&)、逻辑或(|)、逻辑非(!)和逻辑异或(^)。下面对这些逻辑运算符进行详细介绍:
-
短路逻辑与(&&):
- 当且仅当两个操作数都为true时,整个表达式的结果才为true。
- 如果第一个操作数为false,则不会计算第二个操作数,因为整个表达式的结果已经可以确定为false。
- 短路逻辑与可以通过跳过不必要的计算来提高程序性能。
-
短路逻辑或(||):
- 当至少一个操作数为true时,整个表达式的结果为true。
- 如果第一个操作数为true,则不会计算第二个操作数,因为整个表达式的结果已经可以确定为true。
- 短路逻辑或同样可以通过跳过不必要的计算来提高程序性能。
-
逻辑与(&):
- 当且仅当两个操作数都为true时,整个表达式的结果才为true。
- 不管第一个操作数的值是true还是false,都会计算第二个操作数,即使第一个操作数为false,也会继续计算第二个操作数。
- 逻辑与会对两个操作数都进行计算,无论第一个操作数的值如何。
-
逻辑或(|):
- 当至少一个操作数为true时,整个表达式的结果为true。
- 不管第一个操作数的值是true还是false,都会计算第二个操作数,即使第一个操作数为true,也会继续计算第二个操作数。
- 逻辑或同样会对两个操作数都进行计算,无论第一个操作数的值如何。
-
逻辑非(!):
- 用于对布尔值进行取反操作,即将true变为false,将false变为true。
-
逻辑异或(^):
- 用于对两个布尔值进行逻辑异或操作,当且仅当两个操作数的布尔值不相同时,结果为true;当两个操作数的布尔值相同时,结果为false。
逻辑运算符在条件判断、循环控制、布尔运算等场景中起到了重要作用,能够帮助我们构建复杂的逻辑判断和逻辑运算。了解和正确使用逻辑运算符是编程中的基础知识之一。
5. 赋值运算符
赋值运算符用于将一个值赋给变量。在Java中,常用的赋值运算符是等号(=)。除了基本的等号赋值运算符,还有其他赋值运算符的变体,包括加等(+=)、减等(-=)、乘等(*=)、除等(/=)和取模等(%=)。下面对这些赋值运算符进行详细介绍:
-
等号赋值运算符(=):
- 将右边的值赋给左边的变量。
- 左边的变量必须在此之前已经声明过。
-
加等赋值运算符(+=):
- 用于增加变量的值,将右侧的值与左侧变量的值相加,并将结果赋给左侧变量。
- 等效于:变量 = 变量 + 表达式。
-
减等赋值运算符(-=):
- 用于减少变量的值,将右侧的值从左侧变量的值中减去,并将结果赋给左侧变量。
- 等效于:变量 = 变量 - 表达式。
-
乘等赋值运算符(*=):
- 用于将变量的值乘以右侧的值,并将结果赋给左侧变量。
- 等效于:变量 = 变量 * 表达式。
-
除等赋值运算符(/=):
- 用于将变量的值除以右侧的值,并将结果赋给左侧变量。
- 等效于:变量 = 变量 / 表达式。
-
取模等赋值运算符(%=):
- 用于将变量的值除以右侧的值,并将余数赋给左侧变量。
- 等效于:变量 = 变量 % 表达式。
下面是一些示例:
int x = 10;
int y = 5;
x += y; // x的值变为15(相当于 x = x + y)
x -= y; // x的值变为10(相当于 x = x - y)
x *= y; // x的值变为50(相当于 x = x * y)
x /= y; // x的值变为2(相当于 x = x / y)
x %= y; // x的值变为0(相当于 x = x % y)
需要注意的是,赋值运算符是从右向左执行的,所以右侧的表达式会在赋值之前被计算。赋值运算符还具有优先级,如果和其他运算符一起使用,需要使用括号来明确计算的顺序。
6. 三元运算符
三元运算符,也称为条件运算符,是一种在Java中常用的特殊运算符。它由三个表达式组成,具有以下语法形式:
条件表达式 ? 表达式1 : 表达式2
它的作用是根据条件表达式的结果选择性地返回表达式1或表达式2的值。
具体的运算过程如下:
-
首先计算条件表达式的值。如果结果为true,则选择表达式1的值;如果结果为false,则选择表达式2的值。
-
根据选择的值来执行相应的操作。
以下是一个简单的示例:
int x = 5;
int y = 10;
int result = (x > y) ? x : y;
System.out.println(result);
在这个例子中,条件表达式
(x > y)
的结果为false,因此选择了表达式2的值y
。所以结果将会输出10
。
三元运算符在某些情况下可以替代if-else语句,以简化代码。但需要注意的是,由于三元运算符具有较高的优先级,应根据需要使用括号来确保正确的运算顺序。
此外,三元运算符还可以嵌套使用,即在表达式1或表达式2中再使用三元运算符来进行更复杂的条件判断。但过多的嵌套可能会降低代码的可读性,因此需要谨慎使用。
7. 什么是进制
进制是一种数学表示方法,用于表示数字的基数系统。每种进制都有自己的基数和符号集合,决定了可以使用的数字和权值。
常见的进制有二进制(BIN)、八进制(OCT)、十进制(DEC)和十六进制(HEX)。
-
二进制(Binary):使用0和1表示数字。每一位的权值是2的幂次,从右向左依次为2^0、2^1、2^2...。例如,二进制数1011表示十进制数11。二进制在计算机中使用广泛,因为计算机以二进制形式存储和处理数据。
-
八进制(Octal):使用0到7表示数字。每一位的权值是8的幂次。从右向左依次为8^0、8^1、8^2...。例如,八进制数175表示十进制数125。八进制在计算机领域较少使用,但在Unix和Linux系统的文件权限表示中经常使用。
-
十进制(Decimal):使用0到9表示数字。每一位的权值是10的幂次。例如,十进制数579表示它有5个100,7个10,9个1。十进制是我们日常生活中最常用的进制,也是最容易理解和计算的。
-
十六进制(Hexadecimal):使用0到9和A到F(A表示10,F表示15)表示数字。每一位的权值是16的幂次。例如,十六进制数3A7表示它有3个16^2,10个16^1,7个16^0。十六进制经常在计算机中使用,特别是表示内存地址和编码。
在编程中,经常使用不同进制表示整数常量。可以使用不同的前缀来指示使用的进制,例如0b开头表示二进制,0开头表示八进制,0x开头表示十六进制。例如,0b1011表示十进制数11,0175表示十进制数125,0x3A7表示十进制数935。
了解不同进制的表示方法有助于理解计算机中数字的存储和处理方式,并能够更好地进行编码和解码操作。在计算机科学和计算机编程中,理解二进制和十六进制非常重要,因为它们是计算机内部数据的常用表示方式。
8. 进制转换
进制转换是将一个数字从一种进制表示转换为另一种进制表示的过程。下面是常见进制之间的转换方法:
-
二进制转换为其他进制:
- 二进制转换为八进制:将二进制数每三位一组进行划分,然后将每组转换为对应的八进制数。例如,二进制数1011011可以划分为(001)(011)(011),分别转换为八进制后得到(1)(3)(3),即八进制数133。
- 二进制转换为十进制:将二进制数从右到左,依次乘以2的幂次,并将结果相加。例如,二进制数1011011转换为十进制为(1 * 2^6) + (0 * 2^5) + (1 * 2^4) + (1 * 2^3) + (0 * 2^2) + (1 * 2^1) + (1 * 2^0) = 91。
- 二进制转换为十六进制:将二进制数每四位一组进行划分,然后将每组转换为对应的十六进制数。例如,二进制数1011011可以划分为(0101)(1011),分别转换为十六进制后得到(5)(B),即十六进制数5B。
-
八进制转换为其他进制:
- 八进制转换为二进制:将八进制数每一位转换为对应的三位二进制数。例如,八进制数551转换为二进制为(101)(101)(001)。
- 八进制转换为十进制:将八进制数从右到左,依次乘以8的幂次,并将结果相加。例如,八进制数551转换为十进制为(5 * 8^2) + (5 * 8^1) + (1 * 8^0) = 361。
- 八进制转换为十六进制:先将八进制数转换为二进制,然后再将二进制转换为十六进制。
-
十进制转换为其他进制:
- 十进制转换为二进制:使用除以2的余数法,将十进制数不断除以2,直到商为0为止,然后按照余数的倒序得到对应的二进制数。例如,十进制数91转换为二进制为1011011。
- 十进制转换为八进制:使用除以8的余数法,将十进制数不断除以8,直到商为0为止,然后按照余数的倒序得到对应的八进制数。例如,十进制数361转换为八进制为551。
- 十进制转换为十六进制:使用除以16的余数法,将十进制数不断除以16,直到商为0为止,然后按照余数的倒序得到对应的十六进制数。例如,十进制数935转换为十六进制为3A7。
-
十六进制转换为其他进制:
- 十六进制转换为二进制:将十六进制数每一位转换为对应的四位二进制数。例如,十六进制数3A7转换为二进制为(0011)(1010)(0111)。
- 十六进制转换为八进制:先将十六进制数转换为二进制,然后再将二进制转换为八进制。
- 十六进制转换为十进制:将十六进制数从右到左,依次乘以16的幂次,并将结果相加。例如,十六进制数3A7转换为十进制为(3 * 16^2) + (10 * 16^1) + (7 * 16^0) = 935。
掌握进制间的转换方法对于理解数字的不同表示方式和在编程中处理不同进制的数据是非常重要的。
9. 原码、反码和补码
原码、反码和补码是计算机中用来表示有符号整数的三种编码方式。
-
原码(Sign-Magnitude): 原码是最基本的二进制表示方式,其中最高位表示符号位,0表示正数,1表示负数,其余位表示数值的绝对值。例如,十进制数+5的原码为00000101,十进制数-5的原码为10000101。
-
反码(One's Complement): 反码是将原码中正数保持不变,负数的每一位取反得到的编码方式。负数的反码是在原码的基础上,除符号位外,其余各位取反。例如,十进制数+5的反码为00000101,十进制数-5的反码为11111010。
-
补码(Two's Complement): 补码是最常用的有符号整数表示方式。补码的计算方式是将反码加1。正数的补码与原码相同,负数的补码是在反码的基础上加1。例如,十进制数+5的补码为00000101,十进制数-5的补码为11111011。
为了便于理解,以下是一个补码的转换示例:
例如,我们要把十进制数-5转换为补码表示:
- 首先,取其绝对值的二进制表示,即5的原码为00000101;
- 然后,将原码的各位取反得到反码,即11111010;
- 最后,将反码的最低位加1得到补码,即11111011。
反过来,将补码转换为原码时,操作步骤相反,即先减1得到反码,然后各位取反得到原码。
补码表示法的优点是可以统一处理正负数的加减运算,同时允许计算机使用逻辑门实现加法和减法。
10. 位运算符
位运算符是一种特殊的运算符,它主要用于对整数的二进制位进行操作。Java提供了几种常用的位运算符,包括按位与(&)、按位或(|)、按位异或(^)、取反(~)、左移(<<)、右移(>>)和无符号右移(>>>)。
-
按位与(&):对两个操作数的二进制位进行“与”运算,如果两个对应的位都为1,则结果为1,否则为0。
-
按位或(|):对两个操作数的二进制位进行“或”运算,如果两个对应的位中至少有一个为1,则结果为1,否则为0。
-
按位异或(^):对两个操作数的二进制位进行“异或”运算,如果两个对应的位不相同,则结果为1,否则为0。
-
取反(~):对操作数的二进制位进行“取反”运算,将0变为1,将1变为0。
-
左移(<<):将操作数的所有二进制位向左移动指定的位数,右侧用0填充。
-
右移(>>):将操作数的所有二进制位向右移动指定的位数,左侧用原有的符号位填充。
-
无符号右移(>>>):将操作数的所有二进制位向右移动指定的位数,左侧用0填充,忽略符号位。
以下是位运算符的一些示例:
int a = 5; // 二进制为:00000101
int b = 3; // 二进制为:00000011
int c = a & b; // 位与运算结果:00000001,即1
int d = a | b; // 位或运算结果:00000111,即7
int e = a ^ b; // 位异或运算结果:00000110,即6
int f = ~a; // 取反运算结果:11111010,即-6
int g = a << 2; // 左移运算结果:00010100,即20
int h = a >> 2; // 右移运算结果:00000001,即1
int i = a >>> 2; // 无符号右移运算结果:00000001,即1
位运算符主要用于对二进制数据进行处理,例如对图像数据进行处理、进行位掩码操作等。在实际开发中,位运算符的应用相对较少,一般用于一些特定的需求。
11. 运算符优先级
运算符优先级是指在表达式中,不同运算符的执行顺序。当一个表达式中有多个运算符时,根据运算符的优先级确定它们的执行顺序。
在Java中,运算符的优先级从高到低分为以下几个级别:
-
小括号(()):小括号用于改变表达式的计算顺序,括号中的表达式会先于其他运算符进行计算。
-
单目运算符(一元运算符):包括正号(+)、负号(-)、逻辑非(!)和按位取反(~)。它们的优先级相同,从右到左结合。
-
算术运算符:包括乘法(*)、除法(/)、取模(%)、加法(+)和减法(-)。它们的优先级相同,按照从左到右的结合顺序执行。
-
移位运算符:包括左移(<<)、右移(>>)和无符号右移(>>>)。它们的优先级相同,从左到右结合。
-
关系运算符:包括小于(<)、大于(>)、小于等于(<=)、大于等于(>=)、等于(==)和不等于(!=)。它们的优先级相同,从左到右结合。
-
逻辑运算符:包括逻辑与(&&)、逻辑或(||)和逻辑非(!)。逻辑非的优先级最高,逻辑与和逻辑或的优先级相同,从左到右结合。
-
位运算符:包括按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、左移(<<)、右移(>>)和无符号右移(>>>)。它们的优先级相同,从左到右结合。
-
赋值运算符:包括简单赋值(=)和复合赋值运算符(例如+=、-=、*=等)。赋值运算符的优先级最低。
在表达式中,如果有多个运算符,优先级较高的运算符会先执行,如果有相同优先级的运算符,则根据结合性决定执行顺序。
示例:
int result = 10 + 5 * 2; // 先计算5 * 2,再加上10,结果为20
boolean isTrue = (5 > 3) && (10 <= 5) || (8 != 8); // 先计算关系运算符,然后计算逻辑运算符,结果为true
int x = 5;
x += 3 * 2; // 先计算3 * 2,然后将结果与x相加,并将结果赋值给x
如果表达式中有歧义,可以使用小括号来改变运算符的执行顺序。
12. 表达式
在Java中,表达式是由操作数和运算符组成的代码片段,用于进行计算并产生一个结果值。Java中的表达式可以包含以下几种元素:
-
常量:表示具体的数值或字符,比如整数常量(如5)、浮点数常量(如3.14)、字符常量(如'A')等。
-
变量:表示存储数据的内存空间,可以是基本类型的变量(如int、float)或引用类型的变量(如对象、数组)。
-
运算符:用于操作操作数并进行计算,包括算术运算符(如加减乘除)、关系运算符(如等于、大于)、逻辑运算符(如与、或)、赋值运算符等。
-
方法调用:表示调用一个方法并返回结果,可以是标准库提供的方法(比如Math.sqrt(9))或自定义的方法。
-
表达式组合:使用括号来组合多个表达式,控制运算的优先级和顺序,也可以使用条件运算符(三元运算符)来根据条件选择不同的值。
例如,以下是一些Java中的表达式示例:
// 算术表达式
int result = 2 + 3 * 4; // 将4乘以3得到12,再加上2得到14,将结果14赋给result变量
// 关系表达式
boolean isEqual = x == y; // 比较x和y是否相等,将结果赋给isEqual变量
// 逻辑表达式
boolean result = x > 0 && y < 10; // 检查x是否大于0且y是否小于10,将结果赋给result变量
// 赋值表达式
int x = 5; // 将值5赋给x变量
// 方法调用表达式
double sqrtResult = Math.sqrt(9); // 调用Math类的sqrt方法,计算9的平方根,并将结果赋给sqrtResult变量
表达式在Java中常用于赋值语句、条件语句、循环语句等需要进行计算或判断的场景中。它们可以用于进行数学计算、比较值、判断条件、调用方法等操作,并产生最终的结果值。