运算符的精妙

📅 2026/6/18 11:21:57
运算符的精妙
1.运算符和表达式运算符就是对常量或者变量进行操作的符号。比如 - * /表达式用运算符把常量或者变量连接起来的符合Java语法 的式子就是表达式。比如a b 这个整体就是表达式。而其中是算术运算符的一种所以这个表达式也称之为算术表达式。2.算术运算符分类 - * / %运算特点 - * :跟小学数学中一模一样没有任何区别./ 1.整数相除结果只能得到整除如果结果想要是小数必须要有小数参数。 2.小数直接参与运算得到的结果有可能是不精确的。 案例 System.out.println( 10 / 3);//3 System.out.println(10.0 / 3);//3.3333333333333335%取模、取余。 他做的也是除法运算只不过获取的是余数而已。 案例 System.out.println(10 % 2);//0 System.out.println(10 % 3);//1 应用场景 //可以利用取模来判断一个数是奇数还是偶数 System.out.println(15 % 2);//1 奇数练习数值拆分需求键盘录入一个三位数将其拆分为个位、十位、百位后打印在控制台代码示例//1.键盘录入一个三位数 //导包 --- 创建对象 --- 接收数据 Scanner sc new Scanner(System.in); System.out.println(请输入一个三位数); int number sc.nextInt();//123 //2.获取这个三位数的个位、十位、百位并打印出来 //公式 //针对于任意的一个数而言 //个位 数字 % 10 int ones number % 10; //十位 数字 / 10 % 10 int tens number / 10 % 10; //百位 数字 / 100 % 10 int hundreds number / 100 % 10; //输出结果 System.out.println(ones); System.out.println(tens); System.out.println(hundreds);公式获取任意一个数上每一位数。个位数字 % 10十位数字 / 10 % 10百位数字 / 100 % 10千位数字 / 1000 % 10。。。以此类推。。。3.隐式转换概念也叫自动类型提升。就是把一个取值范围小的数据或者变量赋值给另一个取值范围大的变量。此时不需要我们额外写代码单独实现是程序自动帮我们完成的。简单记忆就是小的给大的可以直接给。两种提升规则取值范围小的和取值范围大的进行运算小的会先提升为大的再进行运算。byte、short、char三种类型的数据在运算的时候都会直接先提升为int然后再进行运算。取值范围从小到大的关系byte short int long float double4.隐式转换的练习请看下面案例是否有误如果有问题请说出原因如果没有问题请说出运算过程和运算结果案例一double d 10; System.out.println(d);//10.0解释10是整数整数默认是int类型的。而在取值范围的顺序中byte short int long float double在赋值的时候把一个int类型的赋值给了一个double类型的。把一个小的赋值给一个大的是可以直接给的。案例二byte b 100; int i b;//可以成功赋值解释因为byte的取值范围是小的int的取值范围是大的在底层进行了隐式转换不需要我们额外写代码单独实现是可以直接赋值。案例三int i 10; long n 20L; ??? result i n; 问变量result是什么类型的解释变量i是int类型的变量n是long类型的。而在取值范围的顺序中byte short int long float double变量i里面的值会自动提升为long类型的最终的结果其实就是两个long相加那么最终的result是long类型的。案例四int i 10; long n 100L; double d 20.0; ??? result i n d; 问变量result是什么类型的解释变量i是int类型变量n是long类型变量d是double类型。而在取值范围的顺序中byte short int long float double所以变量i和变量n里面的值在参与运算的时候都会进行类型提升变成double。最终其实就是三个double进行相加那么最终的结果就是double类型的。案例五byte b1 10; byte b2 20; ??? result b1 b2;//int 问变量result是什么类型的解释因为b1和b2都是byte类型的。所以在参与计算的时候变量b1和变量b2里面的值都会自动提升为int类型的。最终其实就是两个int类型的相加最终结果也是int类型的。案例六byte b 10; short s 20; long n 100L; ??? result b s n; 问变量result是什么类型的long解释变量b是byte类型的变量s是short类型的变量n是long类型的。byteshortchar类型的变量在参与运算的时候变量里面的值会直接先提升为int。第一步变量b和变量s里面的值会先提升为int参与运算。int int long第二步而long类型的取值范围是大于int的取值范围的。所以变量b和变量s里面的值会再次提升为long。long long long。所以最终结果是long类型的。5.强制转换概念如果要把一个取值范围大的数据或者变量赋值给另一个取值范围小的变量。是不允许直接操作。如果一定要这么干就需要加入强制转换。书写格式目标数据类型 变量名 目标数据类型被强转的数据简单理解要转成什么类型的那么就在小括号中写什么类型就可以了。案例public class OperatorDemo2 { public static void main(String[] args) { double a 12.3; int b (int) a; System.out.println(b);//12 } }注意点强制转换有可能会导致数据发生错误。数据的精度丢失6.字符串的操作核心技巧当操作中出现字符串时此时就是字符串的连接符会将前后的数据进行拼接并产生一个新的字符串。当连续进行操作时从左到右逐个执行的。7.字符串相加的练习案例11 abc 1结果1abc1解释第一步 1 abc。在这个过程中有字符串参与的所以做的是拼接操作产生一个新的字符串1abc第二步 1abc 1。这个过程中有字符串参与的所以做的也是拼接操作产生一个新的字符串1abc1案例21 2 abc 2 1结果“3abc21”解释第一步1 2 。在这个过程中没有字符串参与的所以做的是加法运算结果为3。第二步3 abc。在这个过程中有字符串参与的所以做的是拼接操作产生一个新的字符串3abc。第三步3abc 2。在这个过程中有字符串参与的所以做的是拼接操作产生一个新的字符串3abc2。第四步3abc2 1。在这个过程中有字符串参与的所以做的是拼接操作产生一个新的字符串“3abc21”案例3String name 黑默丁格; System.out.println(我的名字是 name);结果 我的名字是黑默丁格解释当字符串跟变量相加的时候实际上是跟变量里面的值进行拼接。8.字符的操作规则eg: 字符 字符字符 数字当操作中出现了字符会拿着字符到计算机内置的ASCII码表中去查对应的数字然后再进行计算。案例char c a; int result c 0; System.out.println(result);//97ASCII码表中a ----- 97A ----- 659.算术运算符的总结分类 - * / % 这些操作跟小学数学几乎是一模一样的。注意点/ 和 % 的区别他们两个都是做除法运算/取结果的商。% 取结果的余数。整数操作只能得到整数如果想要得到小数必须有浮点数参与运算。算术运算符的高级用法是以为例进行的讲解其余减法乘法除法的运算规则也是一样的。特例字符串只有操作没有其他操作。10.自增自减运算符分类 自增运算符 -- 自减运算符就是把变量里面的值1--就是把变量里面的值-1使用方式放在变量的前面我们叫做先。 比如a放在变量的后面我们叫做后。 比如a注意点不管是先还是后。单独写在一行的时候运算结果是一模一样的。ps: 上面的b 10 下面的b 11public class ArithmeticoperatorDemo6 { public static void main(String[] args) { int x 10; //后先用后加 //先把x变量中的值拿出来用赋值给y然后再进行自增。 //赋值给y的值是自增前的。 int y x;// x 11 y 10 //先先加后用 //先把x进行自增然后把自增后的结果赋值给左边的变量 //先把x自增变成12然后再把自增之后的12赋值给z int z x;//x 12 z 12 System.out.println(x: x);//12 System.out.println(y: y);//10 System.out.println(z: z);//12 } }案例// int a 10; a;//就是让变量a里面的值 1 System.out.println(a);//11 a;//就是让变量a里面的值 1 System.out.println(a);//12自增自减运算符的应用场景某些情况下变量需要进行加1或者减1的时候使用。比如过生日多一岁就用到了自增运算符。比如购物商场中选择商品数量也用到了自增或者自减运算符。比如统计很多数据中有多少个数据满足要求也用到了自增运算符。11.赋值运算符最为常用的 运算过程就是把等号右边的结果赋值给左边的变量案例public class OperatorDemo6 { public static void main(String[] args) { //1.最为简单的赋值运算符用法 int a 10;//就是把10赋值给变量a System.out.println(a); //2.如果等号右边需要进行计算。 int b 20; int c a b;//先计算等号右边的把计算的结果赋值给左边的变量 System.out.println(c); //3.特殊的用法 a a 10;//先计算等号右边的把计算的结果赋值给左边的变量 System.out.println(a);//20 } }12.扩展赋值运算符分类、-、*、/、%运算规则就是把左边跟右边进行运算把最终的结果赋值给左边对右边没有任何影响。案例public class OperatorDemo7 { public static void main(String[] args) { //扩展赋值运算符 int a 10; int b 20; a b;//把左边和右边相加再把最终的结果赋值给左边对右边没有任何影响 // 相当于 a a b; System.out.println(a);//30 System.out.println(b);//20 } }注意点扩展的赋值运算符中隐层还包含了一个强制转换。以为例。a b ;实际上相当于 a (byte)(a b);public class OperatorDemo8 { public static void main(String[] args) { byte a 10; byte b 20; //a b; a (byte)(a b); System.out.println(a);//30 } }13.关系运算符又叫比较运算符其实就是拿着左边跟右边进行了判断而已。分类符号解释就是判断左边跟右边是否相等如果成立就是true如果不成立就是false!就是判断左边跟右边是否不相等如果成立就是true如果不成立就是false就是判断左边是否大于右边如果成立就是true如果不成立就是false就是判断左边是否大于等于右边如果成立就是true如果不成立就是false就是判断左边是否小于右边如果成立就是true如果不成立就是false就是判断左边是否小于等于右边如果成立就是true如果不成立就是false注意点关系运算符最终的结果一定是布尔类型的。要么是true要么是false在写的时候千万不要写成14.逻辑运算符 和 | 的使用逻辑与而且两边都为真结果才是真只要有一个为假那么结果就是假。|逻辑或或者两边都为假结果才是假只要有一个为真那么结果就是真。代码示例// //两边都是真结果才是真。 System.out.println(true true);//true System.out.println(false false);//false System.out.println(true false);//false System.out.println(false true);//false System.out.println(); // | 或 //两边都是假结果才是假如果有一个为真那么结果就是真。 System.out.println(true | true);//true System.out.println(false | false);//false System.out.println(true | false);//true System.out.println(false | true);//true使用场景根据固定的场景来选择使用还是使用|用户登录。用户名输入正确 密码输入正确因为只有用户名和密码同时都正确了那么才能成功登录只要有一个失败了都不行。使用技巧 当我们需要同时满足左边和右边两种情况时可以使用且丈母娘选女婿丈母娘女婿啊你要么买个房子要么买辆车。就可以把我的小棉袄穿走了。买个房子 | 买辆车两个条件中只要满足其中一个就可以穿走小棉袄了。使用技巧 当两种条件只要满足其中一个的时候可以使用或^异或的使用在以后用的不多了解一下即可。计算规则如果两边相同结果为false如果两边不同结果为true代码示例//^ //左右不相同结果才是true左右相同结果就是false System.out.println(true ^ true);//false System.out.println(false ^ false);//false System.out.println(true ^ false);//true System.out.println(false ^ true);//true!取反的使用是取反也叫做非。计算规则false取反就是truetrue取反就是false温馨提示取反最多只用一个。代码示例System.out.println(!false);//true System.out.println(!true);//false System.out.println(!!false);//注意点取反最多只用一个。15.短路逻辑运算符分类 ||运算结果跟是一模一样的只不过具有短路效果。||运算结果跟|是一模一样的。只不过具有短路效果。逻辑核心当左边不能确定整个表达式的结果右边才会执行。当左边能确定整个表达式的结果那么右边就不会执行了。从而提高了代码的运行效率。举例用户登录案例用户名正确 密码正确如果使用一个不管用户名是否正确都会去验证密码。思考如果用户名输入正确了那么我们再判断密码是否正确是符合业务逻辑的。但是如果用户名输入错误了那么现在还有必要去比较密码吗没有不要了。如果使用一个那么左边和右边不管什么情况下都会执行。用户名正确 密码正确如果用户名输入正确了那么才会验证密码是否输入正确。如果用户名输入错误了那么就不会再去验证密码是否正确最终的结果直接为false。从而提高了程序运行的效率。丈母娘选女婿有房 | 有车首先先看看有没有房发现有然后再去看看有没有车。思考既然都有房子干嘛还要去看车呢多此一举。有房 || 有车首先先看看有没有房如果有那么右边就不执行了。最终的结果直接为true。如果没有房子才会去看右边有没有车。总结 和 、||和|的运行结果都是一模一样的。但是短路逻辑运算符可以提高程序的运行效率。建议最为常用 || 练习public class Test3 { public static void main(String[] args) { /*数字6是一个真正伟大的数字键盘录入两个整数。 如果其中一个为 6最终结果输出true。 如果它们的和为 6的倍数。最终结果输出true。 其他情况都是false。*/ //分析 //1.键盘录入两个整数 // 变量a 变量b //2.a 6 || b 6 || (a b) % 6 0 //如果满足其中一个那么就可以输出true //键盘录入两个整数 Scanner sc new Scanner(System.in); System.out.println(请输入一个整数); int number1 sc.nextInt(); System.out.println(请输入第二个整数); int number2 sc.nextInt(); //可以短路逻辑运算符去连接三个判断 boolean result number1 6 || number2 6 || (number1 number2) % 6 0; System.out.println(result); } }16.三元运算符又叫做三元表达式或者问号冒号表达式。格式关系表达式 表达式1 表达式2 计算规则计算关系表达式的值。如果关系表达式的值为真那么执行表达式1。如果关系表达式的值为假那么执行表达式2。注意点三元运算符的最终结果一定要被使用要么赋值给一个变量要么直接打印出来。案例public class OperatorDemo12 { public static void main(String[] args) { //需求求两个数的较大值 int a 10; int b 20; //格式关系表达式 表达式1 表达式2 //注意点 //三元运算符的最终结果一定要被使用。 //要么赋值给一个变量要么直接输出。 int max a b ? a : b ; System.out.println(max); System.out.println(a b ? a : b); } }17.练习1-两只老虎需求动物园里有两只老虎两只老虎的体重分别为通过键盘录入获得请用程序实现判断两只老虎的体重是否相同。代码示例//1.获取两只老虎的体重 Scanner sc new Scanner(System.in); System.out.println(请输入第一只老虎的体重); int weight1 sc.nextInt(); System.out.println(请输入第二只老虎的体重); int weight2 sc.nextInt(); //2.利用三元运算符求出最终结果 String result weight1 weight2 ? 相同 : 不相同; System.out.println(result);18.练习2-求三个数的最大值需求一座寺庙里住着三个和尚已知他们的身高分别为150cm、210cm、165cm。请用程序实现获取这三个和尚的最高身高。代码示例//1.定义三个变量记录和尚的身高 int height1 150; int height2 210; int height3 165; //2.利用三元运算符求出两个数中的较大值。 int temp height1 height2 ? height1 : height2; //3.求出最终的结果 int max temp height3 ? temp : height3; System.out.println(max);19.运算符的优先级在Java中涉及了很多的运算符每一种运算符都有各自的优先级。但是这些优先级不需要记忆。咱们只要知道其中一点小括号优先于所有。20.拓展原码、反码、补码原码反码补码其他运算符左移右移高位符号位跟你之前数字的一样正数补零、负数补1公式 右移一次除2右移两次除4无符号右移无符号右移 高位无论是正数还是负数都是补0