除法 / 的使用
看一段代码:
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
关系运算的结果都是boolean类型的值,关系运算表达式经常用在if结构或者循环结构的条件中
相等是==,一个=是赋值
用于连接多个条件(表达式),最终结果也是一个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赋值为真就为真,赋值为假就为假,注意赋值和判等
普通赋值:
(1) 运算顺序从左往右 int num = a + b + c
(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可能会有损失
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