” />public class TestDemo{public static void main(String args[]){int numA=10;int numB=20;int result=numA*2numB*numA+++numBnumA+numB;System.out.println(result);}} 程序执行结果: -143
虽然以上程序可以得到最终的计算结果,但是如此复杂的运算代码,代码的可读性和可维护性就变得太差了,可能其他的同事或领导看到都想叼人了,所以在编写程序的时候,应该本着编写“简单代码”的原则,而像本程序这样的代码尽量不要去编写。 1.1 关系运算符关系运算符的主要功能是进行数据的大小关系比较,返回的结果是boolean 型数据(只有true 、false 两种取值),常用的关系运算符有:大于(> )、大于等于(>= )、小于(< )、小于等于(<= )、等于(== )、不等于(!= )。 public class TestDemo{public static void main(String args[]){System.out.println("3>1=" + (3>1));System.out.println("3<1=" + (3<1));System.out.println("3>=1=" + (3>=1));System.out.println("3<=1=" + (3<=1));System.out.println("3==1=" + (3==1));System.out.println("3!=1="+(3!=1));}}
程序执行结果: 3>1=true3=1=true3<=1=false3==1=false3!=1=true
此程序演示了各种关系运算符的使用,考虑到运算符的优先级问题,使用了“() ”运算符先进行关系运算,避免字符串直接拼接出现错误的结果。而对于关系运算符的使用往往是结合后续的分支、循环等程序逻辑控制语句一同进行使用。 1.2 算术运算符算术运算符在开发中经常使用到,例如,进行四则运算、求模(取余)、自增等操作。 public class TestDemo{public static void main(String args[]){int numA=10;int numB=20;System.out.println("加法计算:"+(numA+numB));System.out.println("减法计算:"+(numA-numB));System.out.println("乘法计算:"+(numA*numB));System.out.println("除法计算:"+(numA/(double)numB));}}
程序执行结果: 加法计算:30减法计算:-10乘法计算:200除法计算:0.5
四则运算符的基本操作就是“+ ”、“- ”、“* ”、“/ ”,在程序中进行除法计算时,考虑到计算的精度问题,所以将其中一个int 型变量强制转换为了double 型变量。而“模 ”也是在开发之中较为常见的计算,所谓的“模 ”实际上就是余数的概念,例如:10÷3 的结果是商3余1 ,其中余数1 就是“模 ”,对于求模,可以使用“% ”运算符。 public class TestDemo{public static void main(String args[]){int numA=10;int numB=3;System.out.println(numA % numB);}}
程序执行结果: 1
本程序分别定义了两个int 型变量,随后使用“% ”进行了求模计算,最终的结果就是1 。 虽然Java提供了四则运算操作,但是为了简化用户的编写,在运算符里面又提供了一些简化的复合赋值运算符:*= 、/= 、+= 、-= 、%= ,这些运算符表示参与运算后直接进行赋值操作,下面来看一个具体的代码。 public class TestDemo{public static void main(String args[]){int num=10;num*=2;System.out.println(num);}}
程序执行结果: 20
此程序使用了“num*=2 ”语句替代了“num=num*2 ”的语句,相比较后者,代码的长度更加简短。 而还有一类运算符是“++ ”(自增)、“-- ”(自减),它根据位置不同,执行的顺序也不同。 - 前置用法:
++ 变量、-- 变量:先在前面表示的是先进行变量内容的自增1或自减1,再使用变量进行数学计算; - 后置用法:变量
++ 、变量-- :先使用变量内容进行计算,而后再实现自增或自减的操作。
public class TestDemo{public static void main(String args[]){int numA=10;intnumB=20;int result=++numA+numB;System.out.println("numA=" + numA);System.out.println("result="+result);}}
程序执行结果: numA=11result=31
本程序中 “int result=++numA+numB; ”,语句使用了“++numA ”,表示在与numB 进行加法计算时,首先先对numA 的变量内容进行自增1的操作,即执行完“++numA ”之后,numA 的内容首先变为11 ,然后利用11这个值与numB 变量的20 进行计算,最终的结果就是31 。 public class TestDemo{public static void main(String args[]){int numA=10;intnumB=20;int result = numA+++numB;System.out.println("numA=" + numA);System.out.println("result=" + result);}}
程序执行结果: numA=11result=30
此程序与前一程序的区别在于“++ ”出现的位置,在计算中由于“++ ”在numA 的后面(numA+++numB ),所以表示先使用numA 当前的内容与numB 进行加法计算,再进行自己的自增1操作,所以最终的计算结果为30 。 1.3 三目运算符三目是一种赋值运算的形式,执行三目时可以以一个布尔表达式的结果进行赋值,基本的语法结构如下。 数据类型变量 = 布尔表达式 ? 满足此表达式时设置的内容:不满足此表达式时设置的内容;
public class TestDemo(public static void main(String args[){int numA=10;int numB=20;int max= numA>numB ? numA:numB;System.outprintln(max);}}
程序执行结果: 20
此程序主要是判断 numA 与 numB 哪个变量的内容较大 (numA > numB ), 如果此时的判断条件成立,则表示使用 numA 的变量内容为 max 变量赋值,反之,则使用 numB 的变量内容为max 变量赋值。 对于上面案例的操作,实际上也可以不使用三目运算符完成,可以通过编写如下形式的判断体语句完成: public class TestDemo{public static void main(String args[]){int numA=10;int numB=20;int max=0;if(numA>numB){ max=numA;}else{max=numB;}System.out.println(max);}}
程序执行结果: 20
此程序使用一个分支语句的形式替代了三目运算符的使用,但可以发现的是使用三目运算的赋值操作要明显比 if….else 分支语句的判断赋值代码更简单。 1.4 逻辑运算逻辑运算一共包含3种:与(多个条件一起满足)、或(多个条件有一个满 足)、非(使用“!”操作,可以实现 true 变 false 以及 false 变 true 的结果转换), 而与和或操作的真值表,如下表所示: 条件1 | 条件2 | &、&&(与)结果 | |、||(或)结果 |
---|
true | true | true | true | true | false | false | true | false | true | false | true | false | false | false | false |
1.4.1 与操作与操作表示将若干个条件一起进行连接判断,同时满足返回 true ,有一个不满足返回 false ,对于与 操作有两种运算符:& (普通与)、&& (短路与)。 public class TestDemo {public static void main(String args[]){if ((1!=2)&(10%2==0){ System.out.printIn("Hello World!");}}}
程序执行结果: Hello World!
程序逻辑: 此程序最后输出了字符串,说明& 的表达式中的结果值都为true ,而现在有一种情况是,如果前面的条件已经返回了 false ,后面不管有多少个 true , 按照与操作的 定义,最终的结果还是false ,那么完全没有必要进行后续的判断,所以可以使用短路与进行操作: public class TestDemo {public static void main(String args[]){if((1 ==2)&&(10/0==0)){System.out.printin("Hello World!");}}}
程序执行结果: 正常结束。 程序逻辑: 注意此程序不会因为(10/0==0) 而报错,因为前面的条件返回了false (“1== 2 ”的结果为false ),所以后面的所有判断都没有继续执行到,所以最终的结果只会是false , 而如果此时使用的是& 而非&& 则会导致报错,此处不再做更多演示。 1.4.2 或操作或操作是若干个条件一起判断,其中只要有一个返回 true , 结果就是 true , 只有都返回 false 的时候结果才是 false , 或操作有两种运算: | 和|| 。 public class TestDemo(public static void main(String args[])(if((1==1)|(10/0==0)){System.out.println("Hello World !");}}}
程序运行结果: Exceptioninthread"main"java.lang.ArithmeticException:/byzero at TestDemo.main(TestDemo.java:3)
此程序中使用普通或“| ”操作,但在程序运行的时候出现了异常,即程序中给出的两个判断条件都执行了: 通过程序发现,使用普通或操作的过程中,即使前面的条件满足了,后面的也会进行正常的判断,而或运算中,只要有一个为 true , 那么最终的结果就一定是 true , 所以对于后面的判断似乎没有任何意义,因为不管返回是何种结果都不会影响最终的结果—true , 下面使用短路或(|| ) 来调整程序。 public class TestDemo(public static void main(String args[]){if((1==1)||(10/0==0)){System.out printIn("Hello World!");}}}
程序执行结果:正常结束。 可以发现,前面的条件(1== 1 )满足了就会返回 true , 不管后面是何条件最终的结果都是true , 所以后面的表达式不再执行,程序也没有任何异常产生。程序逻辑如下: 需要注意的是,在实际生产应用编写代码的过程中考虑到性能问题,都会优先考虑短路与和短路或操作。 1.4.3 非操作非就是针对布尔结果进行求反。 public class TestDemo {public static void main(String args[]){boolean flag = true;System.out.println(!flag);}}
程序执行结果: false
非操作的主要功能是进行布尔结果的转换,由于程序中定义的 flag 变量的内容为 true , 所以经过 非处理之后其结果变为 false 。 1.5 位运算位运算在Java 中有:& 、| 、^ 、~ 、>> 、<< 、>>> , 而所有的位运算都是采用 二进制数据进行操作的。 Java 定义的位运算(bitwise operators )直接对整数类型的位进行操作,这些整数类型包括 long,int,short,char 和 byte。 位运算符主要用来对操作数二进制的位进行运算,按位运算表示按每个二进制位(bit)进行计算,其操作数和运算结果都是整型值。 Java 语言中的位运算符分为位逻辑运算符和位移运算符两类: (1)位逻辑运算符包含 4 个:&(与)、|(或)、~(非)和 ^(异或) (2)位移运算符包含3个:<> 位右移、>>> 无符号右移 位运算规则Java 定义的位运算直接对整数类型的位进行操作,运算时会先将十进制数据变为二进制数据。而十进制和二进制之间的数据转换规则如下: 十进制数据变为二进制数据的原则为:数据除2取余,随后倒着排列。例如:25 的二进值为11001 ,但是由于Java的int 型数据为32 位,所以实际上最终的数据 为:“0000000000000000000000000011001 ”。转变过程如下图: 然后再将二进制原码转成二进制补码,之后再正式进行运算。其中需要注意的点有: - 正数的原码,反码和补码都一样;
- 负数的反码:符号位保持不变,其他位取反;
- 负数的补码:反码 + 1;
- 最高位为符号位,0表示正数,1表示负数;
- 0的反码和补码都是0。
1.5.1 位与运算public class TestDemo{public static void main(String args[]){int numA= 9; int numB=11; System.out.println(numA & numB);}}
程序执行结果: 9
计算过程分析: 9 的二进制: 00000000000000000000000000001001 11 的二进制:00000000000000000000000000001011 “& ”结果: 00000000000000000000000000001001 转换为十进制是: 9 1.5.2 位或运算public class TestDemo {public static void main(String args[]){int numA =9; int numB=11; System.out.println(numA|numB);}}
程序执行结果: 11
计算过程分析: 9 的二进制:00000000000000000000000000001001 11 的二进制: 00000000000000000000000000001011 “| ”结果: 00000000000000000000000000001011 转换为十进制是: 11 总结本文介绍了Java中常见的各类运算符,包括一元运算符、算术运算符、移位运算符、关系运算符、相等运算符、位运算符、逻辑运算符、条件运算符和赋值运算符等等。每种运算符都有其特定的运算方式和特征,可以应用于不同的场景。 运算符类型 | 作用 | 应用场景 |
---|
一元运算符 | 用于对单个操作数进行操作,例如逻辑非、求反以及自增和自减等 | 在控制流语句和逻辑判断中非常有用 | 算术运算符 | 支持基本的数学运算,如加法、减法、乘法和除法等 | 用于处理数字计算和相关算术问题 | 移位运算符 | 可对二进制数据进行位级操作,包括左移、带符号右移和无符号右移 | 用于编码、解码和处理位模式数据 | 关系运算符 | 用于比较两个操作数的大小关系,例如小于、大于、小于等于和大于等于 | 用于判断条件和排序问题 | 相等运算符 | 用于判断两个操作数是否相等或不相等 | 在条件判断和对象比较等方面非常有用 | 位运算符 | 用于对整数类型的二进制数据进行位级操作,包括位与、位或和位异或等 | 在处理位标志、掩码和位操作等方面非常常见 | 逻辑运算符 | 用于对布尔值进行逻辑运算,包括逻辑与、逻辑或和逻辑非等 | 用于条件判断和逻辑表达式求值 | 条件运算符 | 是Java中唯一的三元运算符用于根据条件的结果选择执行不同的操作 | 经常用于编写替换简单的if-else语句 | 赋值运算符 | 用于将右侧的值赋给左侧的变量,并支持一些复合赋值运算符的使用 | 在数值计算和变量操作中非常频繁 |
在编写复杂的Java程序时,了解各类运算符的运算方式、特征以及运算符优先级是至关重要的。正确地应用运算符可以简化代码逻辑,提高程序的效率和可读性。 通过本文所提供的应用场景案例,读者可以进一步理解不同运算符的实际应用。掌握这些运算符的用法将帮助开发人员更好地处理问题并设计出更高效的算法。
⏪温习回顾上一篇(点击跳转):《【Java基础教程】(三)程序概念篇 · 上:探索Java编程基础,注释、标识符、关键字、数据类型~》 ⏩继续阅读下一篇(点击跳转):《【Java基础教程】(五)程序概念篇 · 下:夯实基础!全面解析Java程序的逻辑控制体:顺序、选择与循环结构~》
本文部分案例及图片来源: 《第一行代码JAVA》 |