ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

初学Java:对于运算符的认识

初学Java:对于运算符的认识 文章目录运算符1. 什么是运算符2. 算数运算符2.1 基本四则运算符加减乘除模 - * / %2.2 增量运算符 . - . * . / . %2.3 自增/自减运算符 , --3. 关系运算符4. 逻辑运算符重点5. 位运算符6. 移位运算主要了解即可7. 条件运算符或称为三目运算符8. 运算符的优先级运算符这里我们学习运算符顺便跟上篇结合一下提出一个问题什么叫一个表达式表达式通俗来讲就是变量 运算符 表达式1. 什么是运算符计算机的最基本的用途之一就是执行数学运算比如int a10;int b20;ab;ab;上述 和 - 等就是运算符即对操作数进行操作时的符号不同运算符操作的含义不同。作为一门计算机语言Java也提供了一套丰富的运算符来操纵变量Java中的运算符可以主分为以下几个1. 算术运算符 - * / % 2. 关系运算符 3. 逻辑运算符 4. 位运算符 5. 移位运算符 6. 条件运算符2. 算数运算符2.1 基本四则运算符加减乘除模 - * / %int a20;int b10;System.out.println(ab);//30System.out.println(a-b);//10System.out.println(a*b);//200System.out.println(a/b);//2System.out.println(a%b);//0补充模运算相当于数学中除法的余数注意都是二元运算符使用时必须要有左右两个操作数int / int 结果还是 int类型 而且会向下取整int a3;int b2;//在数学中应该是1.5但是在Java中输出结果为一会向下取整即小数点之后全部舍弃掉了System.out.println(a/b);//如果要得到数学中的结果可以使用如下方式double da*1.0/b;System.out.println(d);做除法和取模时右操作数不能为0int a1;int b0;System.out.println(a/b);//运算结果/* Exception in thread main java.lang.ArithmeticException: / by zero at Test.main(Test.java:5) */注意为 0 会报错噢4. 在C语言中我们的 %操作符 只能操作整数但是在Java中 % 不仅可以对整数取模也可以对double类型的值进行取模但是没有意义所以我们一般情况下都是对整数取模的System.out.println(11.5%2.0);//运行结果//1.5采用 % 运算符的表达式其结果的正负性会受到第一个操作数的正负影响即System.out.println(-10%3);//结果是 -1在C语言中我们的 %操作符只能操作整数但是在Java中两侧的操作数类型不一致时向类型大的提升所以说我们的Java是自由哒咳咳继续看System.out.println(10.2);// 的左侧是int 右侧是 double 在加之前 int 会被提升为double//所以会输出 1.22.2 增量运算符 . - . * . / . %该种类型运算符操作完成后会将操纵的结果赋值给左操作数。int a1;a2;//相当于 a a 2;System.out.println(a);//输出3a-1;//相当于 a a - 1System.out,println(a);//输出2a*3;//相当于 a a * 3System.out.println(a);//输出6a/3;//相当于 a a / 3System.out.println(a);//输出2a%3;// 相当于 a a % 3System.out.println(a);//输出2注意只有变量才能使用该运算符常量不能使用。还有别写成这种情况32补充int c10;long d20;ccd;//会报错在运算时c会提升为long类型可是赋值给的c又是没有被类型提升的System.out.println(c);但是呢有一个小知识点写成这样就可以了int c10;long d20;cd;//这里会直接给你提升为long然后成功运算System.out.println(c);2.3 自增/自减运算符 , –是给变量的值 1–是给变量的值减一。int a1;a;//后置表示给a的值加1此时a的值为2System.out.println(a);//注意后置是先使用变量原来的值表达式结束后再给原来的值赋值1因此输出2System.out.println(a);//输出3a;// 前置 表示给a的值加1System.out.println(a);// 注意前置是先给变量1然后使用变量中的值因此输出5System.out,println(a);// 输出5// --操作符给操作-1与含义类似尤其是在进行混合使用的情况下一定要搞清楚前置 与 后置 的区别。注意如果单独使用【前置】和【后置】没有任何区别如果混合使用【前置】先1然后使用变量1后的值【后置】先使用变量原来的值表达式结束时才给变量1只有变量才能使用自增/自减运算符常量不能使用因为常量是不允许被修改的3. 关系运算符关系运算符主要有六个 ,其计算结果是 true 或者 falseint a10;int b20;//注意在Java中 表示赋值要与数学中的含义区分//在Java中 表示相等System.out.println(ab);//falseSystem.out.println(a!b);//trueSystem.out.println(ab);//trueSystem.out.println(ab);//falseSystem.out.println(ab);//trueSystem.out.println(ab);//false注意当需要多次判断时不能连着写否则都无法进行编译比如int a10;System.out.println(3a5);在这里说明一下缘由在介绍关系运算符的开头就说明了我们的关系运算符其计算结果是true或false所以说怎么可能拿一个表示真假的关键字来表示数字的大或小。4. 逻辑运算符重点逻辑运算符主要有三个 || !运算结果都是boolean类型。逻辑 与 语法规则表达式1 表达示2左右表达式必须是boolean类型的结果。相当于现实生活中的且比如如果是学生并且带有学生证才能享受半票。即两个表达式都为真结果才是真只要有一个是假结果就是假int a1;int b2;System.out.println(a1b2);//左为真且右为真则结果为真System.out.println(a1b100);//左为真但右为假则结果为假System.out.println(a100b100);//左为假且右为真则结果为假System.out.println(a100b100);//左为假且右为假则结果为假);逻辑 ||语法规则表达式1 || 表达式2左右表达式必须是 boolean类型的结果。相当于现实生活中的或比如买房子交钱时全款 或者 按揭都可以如果全款或者按揭房子都是你的否则站一边去。int a1;int b2;System.out.println(a1||b2);// 左为真 且 右为真 则结果为真System.out.println(a1||b100);// 左为真 但 右为假 则结果也为真System.out.println(a100||b2);// 左为假 但 右为真 则结果也为真System.out.println(a100||b100);// 左为假 且 右为假 则结果为假注意左右表达式至少有一个为真则结果为真逻辑非 语法规则 ! 表达式真变假假变真int a1;System.out.println(!(a1));// a 1 为true取个非就是falseSystem.out.println(!(a!1));// a ! 1 为false取个非就是true补充短路求值讲一下短路与和短路或 和 || 遵守短路求值的规则System.out.println(102010/00);//为trueSystem.out.println(1020||10/00);//为true我们都知道计算10 / 0会导致程序抛出异常但是上面的代码却能正常运行说明10 / 0并没有被真正的求值。注意对于 如果左侧表达式返回的值为false则表达式的结果一定是false无需计算右侧表达式即当两个表达式同时为真结果就是真但是只要第一个表达式为假那么其结果就为假此时并不会执行第2个表达式。验证publicclassTest{publicstaticvoidmain(String[]args){int a1;int b2;System.out.println(ab10/00);}}上述代码执行的结果是false并没有报错所以说明了后面的代码确实没有被执行。2. 对于 || 如果左侧表达式返回的值为true则表达式结果一定是true无需计算右侧表达式其他的小点跟****很像在这里就不过多阐述了。3. 和 | 如果表达式结果为 boolean 时也表示逻辑运算但与 || 相比它们不支持短路求值System.out.println(102010/0);//程序抛出异常System.out.println(1020|10/0);//程序抛出异常我们后面要讲到的 按位与和 按位或| 没有所谓的 短路现象。5. 位运算符Java中数据存储的最小单位是字节而数据操作的最小单位是比特位字节是最小的存储单位每个字节是由8个二进制的比特位组成的多个字节组合在一起可以表示各种不同的数据。位运算符主要有四个 | ~ ^除了 ~ 是一元运算符外其余都是二元运算符。位操作符表示按二级制位运算计算机中都是使用二级制来表示苏数据的01构成的序列按位计算就是在按照二进制位的每一位依次进行计算。按位与 :有0则0全1为1int a10;int b20;System.out.println(ab);进行按位计算需要把 10 和 20 转成二进制分别为 1010 和 10100即0000101000010100————————00000000按位或 |有1为1全0为0int a10;int b20;System.out.println(a|b);运算方式和按位与类似即0000101000010100————————000111110注意当 和 | 的操作数为整数(int , short , long , byte)的时候表示按位运算当 boolean 的时候表示逻辑运算。按位异或 ^如果两个数字的二进制相同则结果为 0 相异则结果为 1.即相同为1相异为0int a0x1;int b0x2;System.out.printf(%x\n,a^b);注意如果两个数相同则异或的结果为0.按位取反 ~如果该位为 0 则转为 1 如果该位为 1 则 0int a0xf;System.out.print(%x\n,~a);注意1.0x 前缀的数字为十六进制数字(十六进制可以看成是二进制的简化表示方式一个十六进制数字对应4个二进制位.)2.0xf表示10进制的15也就是二进制的 1111.3.printf能够格式化输出内容%x表示按照十六进制输出4.\n表示换行符这里补充一下我们的 和 | 事实上是可以代替 以及 ||其使用的只不过不存在短路的问题publicclassTest{publicstaticvoidmain(String[]arge){int a1;int b2;System.out.println(1020100);//真System.out.println(1020100);//第一个为假System.out.println(1020100);//第二个为假System.out.printtn(1020100);//都为假System.out.println(102010/00);报错因为不存在短路问题后续代码会被执行导致/0报错}}6. 移位运算主要了解即可移位运算符有三个** , , **都是二元运算符且按照二进制比特位来运算。左移 最左侧不要了最右侧补0.int a0x10;System.out.println(a1);//运行结果注意是按照十六进制来进行打印的//20通俗来讲就是可以这样0000 1011 ——移一位—— 11进行操作后0001 0110 ———— 22注意向左移位时丢弃的是符号位因此正数左移可能会编程负数。2.右移 最右侧位不要了最左侧符号位正数补0负数补1简单来说就是符号位什么是就补什么int a0x10System.out.println(a1);//运行结果注意是按照十六进制打印//8int b0xffff0000;System.out.prinyln(b1);//运行结果注意是按照十六进制打印的//ffff8000可以这样0000 1011 ——移一位—— 0000 0101 ———— 50000 1011 ——移两位——0000 0010 ———— 23.无符号右移 最右侧不要了最左侧补0int a0xffffffff;System.out.println(a1);//运行结果是按照十六进制来进行打印//7fffffff注意1. 左移一位相当于原数字 * 2左移 N 位相当于原数字 * 2的N次方。2.右移一位相当于原数字 / 2 右移N位相当于原数字 / 2 的N次方。3. 由于计算机计算移位的效率要远高于计算乘除当某个代码正好乘除 2 的N次方的时候就可以用移位运算代替。4. 移动负数位或者移位数过大时没有意义。7. 条件运算符或称为三目运算符条件运算符只有一个表达式1 表达式 2 表达式3当表达式1的值为true时整个表达式的值为表达式2的值.当表达式1的值为false时整个表达式的值为表达式3的值。也是Java中唯一的一个三目运算符是条件判断语句的简化写法。补充有一个好的记忆方法即表达式1是正确的吗如果表达式是正确的那么就返回表达式2的值如果表达式1是错误的那么就返回表达式3的值//求两个整数的最大值int a10;int b20;int maxab?a:b;这里再来一道小题大家感兴趣可以看看boolean flgtruetrue?truefalse?false:true:false;System.out.println(flg);给上 () 就好了解了这里给图解释一下即boolean flg(truetrue)?(truefalse?false:true):false;System.out.println(flg);所以我们其实没有必要去强行记忆 (就是死记硬背) 每一个运算符的优先级要常用 ** () **注意表达式2和表达式3的结果要是同类型的除非能发生类型隐式转换int a10;int b20;int cab?1:2.0;表达式不能单独存在其产生的结果是必定会被使用的。int a10;int b20;ab?a:b;//会报错因为其产生的结果是没有被使用的。8. 运算符的优先级在一条表达式中各个运算符可以混合起来运算但是运算符的优先级不同比如 * 和 / 的优先级要高于 和 - 有些情况下稍不注意可能就会造成很大的麻烦。//求 a 和 b 的平均值int a10;int b20;int ca(b-a)1;System.out.println(c);上述表达式中由于 的优先级要高于 因此 a 先和 b - a 的结果做加法整体为20最后在进行右移因此结果为10.注意:运算符之间是有优先级的具体的规则我们不必记忆在可能存在歧义的代码中加上括号即可。//求a和b的平均值int a10;int b20;int ca((b-a)1);System.out.println(c);欧克了.要知道这个优先级不要去死记硬背要习惯化用().
返回列表