赞
踩
目录
计算机的最基本的用途之一就是执行数学运算,比如
- int a = 10;
- int b = 20;
- a + b;
- a < b;
上述 + 和 < 等就是运算符,即:对操作数进行操作时的符号,不同运算符操作的含义不同。 作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量。Java中运算符可分为以下:算术运算符(+ - * /)、关系运算符(< > ==)、逻辑运算符、位运算符、移位运算符以及条件运算符等。
在Java中,算术运算符与C语言相似,由加减乘除模组成,对应的使用方法也相类似。
其中,除运算得出的结果需要舍去小数点,模运算的计算结果就是余数
注意事项:
1、都是二元运算符,使用时必须要有左右两个操作数2、int / int 结果还是int类型,而且会向下取整
我们可以通过下面这段代码来更好地感受一下算术运算符的使用方法
- int a = 3;
- int b = 2;
- // 在数学中应该是1.5 但是在Java中输出结果为1 会向下取整,即小数点之后全部舍弃掉了
- System.out.println(a / b);
- // 如果要得到数学中的结果,可以使用如下方式
- double d = a*1.0 / b;
- System.out.println(d);
3、做除法和取模时,右操作数不能为0
当Java中进行除法和取模运算的时候,如果右操作数为0,编译器会进行报错,例如下面这段代码:
- int a = 1;
- int b = 0;
- System.out.println(a / b)
这段代码的右操作数为0,因此在编译器中运行的时候会进行报错,报错情况如下:
我们来研究一下这段报错:
开头的单词Exception翻译过后是异常的意思,在我们学习Java的过程中,经常会碰到这个单词,异常是程序报错中比较常见的一种错误,Java中有多种类型的异常,每一种异常都代表了不同的意思。
而这段报错中的ArithmeticException就是算数异常的意思。在第一行的末尾,我们可以看到/ by zero这个是这段代码的具体报错原因
在报错的最后,我们可以看到一行字:at Test.main(Test.java:5) 这代表的是报错代码的所在的具体位置,方便我们对代码进行修正
4、% 不仅可以对整型取模,也可以对double类型取模,但是没有意义,一般都是对整型取模的
- System.out.println(11.5 % 2.0);
- // 运行结果1.5
5、两侧操作数类型不一致时,向类型大的提升
- System.out.println(1+0.2); // +的左侧是int,右侧是double,在加之前int被提升为double
- // 故:输出1.2
- int a = 1;
- a += 2; // 相当于 a = a + 2
- System.out.println(a); // 输出3
- a -= 1; // 相当于 a = a - 1
- System.out.println(a); // 输出2
- a *= 3; // 相当于 a = a * 3
- System.out.println(a); // 输出6
- a /= 3; // 相当于 a = a / 3
- System.out.println(a); // 输出2
- a %= 3; // 相当于 a = a % 2
- System.out.println(a); // 输出2
- int a = 1;
- a++; // 后置++ 表示给a的值加1,此时a的值为2
- System.out.println(a++); // 注意:后置++是先使用变量原来值,表示式结束时给变量+1,因此输出2
- System.out.println(a); // 输出3
- ++a; // 前置++ 表示给a的值加1
- System.out.println(++a); // 注意:前置++是先给变量+1,然后使用变量中的值,因此输出5
- System.out.println(a); // 输出5
- // --操作符给操作-1,与++含义类似
注意事项
如果单独使用,【前置 ++ 】和【后置 ++ 】没有任何区别如果混合使用,【前置 ++ 】先 +1 ,然后使用变量 +1 之后的值,【后置 ++ 】先使用变量原来的值,表达式结束时给变量+1只有变量才能使用自增 / 自减运算符,常量不能使用,因为常量不允许被修改
注意!!!此处有一个特例!!我们来看一下这段代码的运行结果是什么
- public class Test {
- public static void main(String[] args) {
- int a = 10;
- a = a--;
- System.out.println(a);
- }
- }
答案是10
这是因为Java对于这种情况有自己的处理方式而导致的,我们只需记住这个结论便可
- int a = 10;
- int b = 20;
- // 注意:在Java中 = 表示赋值,要与数学中的含义区分
- // 在Java中 == 表示相等
- System.out.println(a == b); // false
- System.out.println(a != b); // true
- System.out.println(a < b); // true
- System.out.println(a > b); // false
- System.out.println(a <= b); // true
- System.out.println(a >= b); // false
- public class Test {
- public static void main(String[] args) {
- int a = 1;
- int b = 2;
- if(a<b<5){
- System.out.println("true");
- }
- }
- }
我们会发现,这段代码无法正常的编译,这是因为编译器会先进行a<b的比较,比较结果为true,此时再将true和5进行比较,而true是布尔类型,5是int类型,无法进行比较,因此会发生报错
总结:表达式均为真,整体才为真
总结:只要有一个表达式为真,则整体为真
语法规则:! 表达式 。 总结:真变假,假变真。
- System.out.println(10 > 20 && 10 / 0 == 0); // 打印 false
- System.out.println(10 < 20 || 10 / 0 == 0); // 打印 true
对于 && , 如果 左侧表达式值为 false, 则表达式结果一定是 false, 无需计算右侧表达式 .对于 ||, 如果 左侧表达式值为 true, 则表达式结果一定是 true, 无需计算右侧表达式 .& 和 | 如果表达式结果为 boolean 时 , 也表示逻辑运算 . 但与 && || 相比 , 它们不支持短路求值
这里,我们要注意:&和|是不会发生短路求值的操作符,因此在平时代码的书写中,我们应该尽量使用&&和||操作符,避免不必要的错误发生,如:
- System.out.println(10 > 20 & 10 / 0 == 0); // 程序抛出异常
- System.out.println(10 < 20 | 10 / 0 == 0); // 程序抛出异常
这段代码便是因为&和|不会发生短路求值而导致的程序异常
进行按位运算, 需要先把 10 和 20 转成二进制, 分别为 1010 和 10100
如果两个二进制位都是 0, 则结果为 0, 否则结果为 1.
- int a = 10;
- int b = 20;
- System.out.println(a | b);
- int a = 0xf;
- System.out.printf("%x\n", ~a)
注意事项:
0x 前缀的数字为 十六进制 数字 . 十六进制可以看成是二进制的简化表示方式 . 一个十六进制数字对应 4 个二进制位.0xf 表示 10 进制的 15, 也就是二进制的 1111printf 能够格式化输出内容 , %x 表示按照十六进制输出 .\n 表示换行符
- int a = 0x1;
- int b = 0x2;
- System.out.printf("%x\n", a ^ b);
总结:相同为0,相异为1
最左侧位不要了, 最右侧补 0.
- int a = 0x10;
- System.out.printf("%x\n", a << 1);
- // 运行结果(注意, 是按十六进制打印的)
- //20
注意:向左移位时,丢弃的是符号位,因此正数左移可能会编程负数
运行结果相当于×2
- int a = 0x10;
- System.out.printf("%x\n", a >> 1);
- // 运行结果(注意, 是按十六进制打印的)
- 8
- int b = 0xffff0000;
- System.out.printf("%x\n", b >> 1);
- // 运行结果(注意, 是按十六进制打印的)
- ffff8000
- int a = 0xffffffff;
- System.out.printf("%x\n", a >>> 1);
- // 运行结果(注意, 是按十六进制打印的)
- 7fffffff
注意:
1. 左移 1 位 , 相当于原数字 * 2. 左移 N 位 , 相当于原数字 * 2 的 N 次方 .2. 右移 1 位 , 相当于原数字 / 2. 右移 N 位 , 相当于原数字 / 2 的 N 次方 .3. 由于 计算机计算移位效率高于计算乘除, 当某个代码正好乘除 2 的 N 次方的时候可以用移位运算代替 .4. 移动负数位或者移位位数过大都没有意义 .
- // 求两个整数的最大值
- int a = 10;
- int b = 20;
- int max = a > b ? a : b;
1. 表达式2和表达式3的结果要是同类型的,除非能发生类型隐式类型转换
- int a = 10;
- int b = 20;
- int c = a > b? 1 : 2.0;
2、表达式不能单独存在,其产生的结果必须要被使用
- int a = 10;
- int b = 20;
- a > b? a : b; // 报错:Error:(15, 14) java: 不是语句
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。