韩顺平Java03(运算符)
运算符
1.算术运算符 arithmetic:算术
-
除法 / 的使用
看一段代码:
System.out.println(10 / 4); //输出为2 因为是两个整数相除,所以结果默认用整数来接收 System.out.println(10.0 / 4);//输出为2.5 double d = 10 / 4; System.out.println("d=" + d);//d=2.0
这里相当于两个整数相除,所以结果默认用整数来接收,然后将2这个int类型的数赋值给了double类型所以是2.0
System.out.println(10 % 3);//1 System.out.println(10 % -3);//1 商-3余1 System.out.println(-10 % 3);//-1 商3余-1 System.out.println(-10 % -3);//-1 商-3余-1
-
自增/自减运算 :
int j = 8; int k = ++j;//等价于 j=j+1; k=j int k = j++ //等价于 k=j; j=j+1
其他以此类推
++在作为一条独立语句的时候++i和i++是绝对等价的,但作为赋值语句的时候则遵循上述规则
一道经典面试题:
int i = 1; i = i++; System.out.println(i);//1 //这里因为是给自身赋值会使用到一个临时变量 //(1)temp = i (2)i = i + 1 (3)i = temp int i = 1; i = ++i; System.out.println(i);//2 (1)i = i + 1 (2)temp = i (3)i = temp
例子:
int i1 = 10; int i2 = 20; int i = i1++; System.out.println("i="+i);//i=10 System.out.println("i2="+i2);//i2=20 i = --i2;//这里虽然是赋值但是i2已经进行了自减运算所以i2变成了19 System.out.println("i="+i);//i=19 System.out.println("i2="+i2);//i2=19
当自增赋值给自身时如i=i++,i的结果并不会改变,但是当赋值给其他变量时,自增的变量(在赋值的时候)就会发生改变 int j = i++ 这个时候i已经+1了
int x = 5; System.out.println(x++==6); //false 这里先比较后自增 System.out.println(x); //6
练习
int day = 21456; System.out.println("还有"+ (day/7) + "个星期零" + day % 7 + "天放假"); double degree = 1234.6; System.out.println("华氏温度" + degree + "是摄氏温度" + (degree-100)*5/9);
(degree-100)5/9也可以写成 5.0/9(degree-100)但是不能写成 5/9*(degree-100),结果会是0.0 ,因为5/9的结果是0
2.关系运算符
-
关系运算的结果都是boolean类型的值,关系运算表达式经常用在if结构或者循环结构的条件中
-
相等是==,一个=是赋值
3.逻辑运算符
-
用于连接多个条件(表达式),最终结果也是一个boolean类型的值
-
实际运算中基本使用短路操作(&&和||)
-
短路与(&&)和逻辑与(&)
对短路与(&&)而言,如果第一个条件判断为false则不再判断第二个条件,效率较高。而逻辑与即使第一个条件判断为false也会继续判断第二个。
int a = 5; int b = 15; if(a < 1 && ++b >10){ //虽然判断a<1为假但是依然执行++b,如果a的条件是真的++b还是会执行的 System.out.println("666"); } System.out.println("a = " + a + "b = " + b); //a = 5 b = 15 if(a < 1 & ++b >10){ System.out.println("666"); } System.out.println("a = " + a + "b = " + b);//a = 5 b = 16
-
短路或(||)和逻辑或(|)
短路或(||):如果第一个条件为真则不再判断第二个条件。
逻辑或(|):如果第一个条件为真则也会判断第二个条件。
int a = 5; int b = 15; if(a < 10 || ++b >10){ System.out.println("666"); } System.out.println("a = " + a + "b = " + b); //666 a = 5 b = 15 if(a < 10 | ++b >10){ System.out.println("666"); } System.out.println("a = " + a + "b = " + b);//666 a = 5 b = 16
-
逻辑非(!)和逻辑异或(^) inverse:相反
boolean flag = true; boolean flag2 = !flag; System.out.println(flag ^ flag2); //true
逻辑异或(^):两个条件不一样为真,否则为假
-
练习
boolean x = true; boolean y = false; short z = 46; if ((z++==46) && (y = true)) z++; if ((x=false) || (++z==49)) z++; //这里x=false为假 System.out.println("z=" + z); //z=50 System.out.println("x=" + x + " " + "y=" + y); //x=false y=true
if语句里x赋值为真就为真,赋值为假就为假,注意赋值和判等
4.赋值运算符
-
普通赋值:
(2)赋值运算符的左边只能是变量,右边可以是变量、表达式、常量值。
-
复合赋值运算符:
a+=1 等价于 a = a + 1 其他符号以此类推
复合赋值运算符(和自增运算)会进行强制类型转换
byte b = 127; b+=1; System.out.println(b);//128 byte b = 2; b+=1; b++;
我们之前说过byte、short和char进行运算时会自动转换为int类型,但是在这里:
b+=1; 等价于 b = (byte)(b + 1)
b++; 等价于 b = (byte)(b + 1 )
如果讲述上表达式改为:
byte b = 2; b=b+1;
则会报错:从int转换到byte可能会有损失
5.三元运算符(Ternary operator)
int a = 10, b = 20; int result = a > b ? a++ : b--; System.out.println(result); //20 System.out.println(a); //10 System.out.println(b); //19
这里 a > b 判断结果为假 ,所以执行第二个表达式 b--,b--赋值给result的时候是先赋值再-1,所以result的输出是20,而因为没执行第一个表达式所以a的值保持不变。
-
注意事项:两个表达式的类型要和接收变量的类型保持一致,如果不一致也要是可以进行自动类型转换的(小单位赋值给大单位),或者手动加上强制类型转换
int a = 10, b = 20; int c = a > b ? 1.2 : 1.5; //x 错误写法 double c = a > b ? 1.2 : 1.5; // √ int c = a > b ? (int)1.2 : (int)1.5; // √
-
练习:找出三个数的最大值
int a = 10, b = 20, c = 6; int max1 = a > b ? a : b; int max2 = max1 > c ? max1 : c; System.out.println("最大值为:" + max2); //20
- 运算符优先级(从高到低依次降低)
标识符
- 关键字和保留字
键盘输入
Scanner sc = new Scanner(System.in);
System.out.println("please enter name:");
String name = sc.nextLine();
System.out.println("your name is :"+ name);
System.out.println("please enter r:");
double r = sc.nextDouble(); //其他类型同理
System.out.println("s = " + 3.14*r*r);
char gender = sc.next().charAt(0); //接收字符的方法
进制
- 二进制(binary)
- 八进制(octal)
- 十进制(decimal)
- 十六进制(hexadecimal)
- 2 -> 10(其他转10以此类推)
- 10 - > 2(10转其他以此类推)
- 2 - >8
- 2 -> 16
- 8 - >2
- 16 -> 2
- 原码、反码和补码
补码使得负数和整数能够一同运算
- 位运算符
System.out.println(2 & 3); /*2是一个int型变量 并且是正整数 占四个字节 三码合一 原码:0000 0000 0000 0010 反码:0000 0000 0000 0010 补码:0000 0000 0000 0010 3同理 原码:0000 0000 0000 0011 反码:0000 0000 0000 0011 补码:0000 0000 0000 0011 在运算是是两数的补码进行运算 0000 0000 0000 0010 0000 0000 0000 0011
得到:0000 0000 0000 0010
符号位是0所以是一个正整数 三码合一 所以转换成十进制是2 */
System.out.println(~ 2); /*2是一个int型变量 并且是正整数 占四个字节 三码合一 原码:0000 0000 0000 0010 反码:0000 0000 0000 0010 补码:0000 0000 0000 0010 进行按位取反 得到:1111 1111 1111 1101 符号位是1所以是一个负整数,输出时需要将补码转换成原码 反码是补码-1,码转换时注意符号位不变 反码:1111 1111 1111 1100 原码:1000 0000 0000 0011 所以转换成十进制是-3 */
其他以此类推
正整数右移一位相当于/2,左移一位相当于*2
而负数在计算机中采用补码表示
System.out.println( -5 >> 2); // -2 /** * -5 * 原码:1000 0000 0000 0101 * 反码:1111 1111 1111 1010 * 补码:1111 1111 1111 1011 * 右移一位(高位用符号位1来补全) * 1111 1111 1111 1101 * 右移两位 * 1111 1111 1111 1110 * 结果的反码: * 1111 1111 1111 1101 * 结果的原码: * 1000 0000 0000 0010 * 转换为10进制是-2 */
本文来自博客园,作者:紫英626,转载请注明原文链接:https://www.cnblogs.com/recorderM/p/15640888.html