运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。
算术运算符:
除法、取余:
package com.rucoding.d4;
/**
* @author LiuYiXin
* 算术运算符: + - * / % 前 ++ 后++ ,前-- 后--
*/
public class SuanShuDemo01 {
public static void main(String[] args) {
// / % 前 ++ 后++ ,前-- 后--
//①.除号 /
int num1 = 12;
int num2 = 5;
int result1 = num1 / num2;
// System.out.println(result1); //2 ,int为整型,截断操作
int result2 = num1 / num2 * num2;
// System.out.println(result2); //10
double result3 = num1 / num2; //int类型运算,还是int整型
// System.out.println(result3);
double result4 = num1 / num2 + 0.0; //2.0,此时是先进行除法运算
double result5 = num1 / (num2 + 0.0); //括号内提升为double类型,运算结果自然是double类型,2.4
double result6 = (double)(num1 / num2); //2.0
double result7 = (double)num1 / num2; //2.4
double result8 = num1 / (double)num2; //2.4
//②. 取余运算
//使用场景: 开发中,经常使用取模%来判断能否被除尽的情况。
//结果的符号与被模数的符号相同
int m1 = 12;
int n1 = 5;
System.out.println("被模数m1 取模% n1 =" + (m1 % n1));
int m2 = -12;
int n2 = 5;
System.out.println("被模数m2 取模% n2 =" + (m2 % n2));
int m3 = 12;
int n3 = -5;
System.out.println("被模数m3 取模% n3 =" + (m3 % n3));
int m4 = -12;
int n4 = -5;
System.out.println("被模数m4 取模% n4 =" + (m4 % n4));
}
}
加号应用场景:
(1)、表示正数,+5 即是 5;
(2)、相加操作:数学加法运算,例如 5 + 6;
(3)、字符串的拼接: +左右两侧的任意一侧有字符串,那么这个加号就是字符串拼接的作用,结果一定是字符串。
知识点1: 大小写字母和数字的ASCII码值: a-z:97-122,A-Z:65-90,0-9:48-57。(记住吧)
代码演示:
package com.rucoding.d4;
/**
* @author LiuYiXin
*
*/
public class SuanShuAddDemo01 {
public static void main(String[] args) {
//算术运算符的加号
//①.表示正数
System.out.println(+5);
//②.相加操作
System.out.println(5 + 6);
System.out.println(5 + '6'); //单引号字符,此时加号是运算操作,'6'会被转义为54 ,结果为59
//温馨提示: 大小写字母和数字的ASCII码值:a-z:97-122,A-Z:65-90,0-9:48-57。(记住吧)
//③.字符串的拼接: +左右两侧的任意一侧有字符串,那么这个加号就是字符串拼接的作用,结果一定是字符串
int num = 56;
System.out.println("num = " + num); //"num =56" ==> num = 56
System.out.println(5 + 6 + "7"); //117
System.out.println(5 + '6' + "7"); //597
System.out.println("5" + 6 + "7");//567
System.out.println("5" + '6' + "7");//567
System.out.println("5"+ '6' + '7');//567
System.out.println('5'+ '6' + '7');//162
}
}
(前) ++ : 先自增1,后进行运算
(后) -- : 先进行运算,后自增1
(前) -- : 先自减1,后进行运算
(后) -- : 先进行运算,后自减1
记住点:自增1不会改变本身变量的数据类型!
package com.rucoding.d4;
/**
* @author LiuYiXin
*
*/
public class SeflAddDemo01 {
public static void main(String[] args) {
//(前) ++ : 先自增1,后进行运算
//(后) -- : 先进行运算,后自增1
int a1 = 10;
int b1 = ++a1; //前++ 先拿自增+的结果 为11
System.out.println("a1 = " + a1 + ",b1 = " + b1); //11,11
int a2 = 10;
int b2 = a2++; //后++
System.out.println("a2 = " + a2 + ",b2 = " + b2); //11,10
int a3 = 10;
++a3; //a3++;
int b3 = a3;
System.out.println("b3 = " + b3);
//划重点了
short s1 = 10;
// s1 = s1 + 1; //编译不通过, 1默认的类型int类型,自动提升为int
s1 =(short)(s1 + 1);//Change type of 's1' to 'int' 或者 Add case to 'short'(这里选择的)
s1++; //自增1不会改变本身变量的数据类型哦!!!
System.out.println("s1 = " + s1);
//引申
byte bb1 = 127;
bb1++;
System.out.println("bb1 = " + bb1); //-128
//(前) -- : 先自减1,后进行运算
//(后) -- : 先进行运算,后自减1
int a4 = 10;
int b4 = a4--;//int b4 = --a4
System.out.println("a4 = " + a4 + ",b4 = " + b4); //9,10
}
}
赋值运算符:= += -= *= /= %=
代码演示:
package com.rucoding.d4;
/**
* @author LiuYiXin
* 赋值运算符: = += -= *= /= %=
*/
public class SetValueDemo01 {
//赋值运算符
public static void main(String[] args) {
//赋值符号, =
int i1 = 10;
int j1 = 10;
int i2,j2;
//连续赋值
i2 = j2 = 10;
int i3 = 10 , j3 = 10;
//
int num1 = 10;
num1 += 2; //num1 = num1 + 2;
System.out.println("num1 = " + num1);
int num2 = 12;
num2 %= 5;// num2 = num2 % 5;
System.out.println("num2 = " +num2);
short s1 = 10;
// s1 = s1 + 2;//编译肯定不过
s1 += 2;//编译可以通过. 表明不会改变变量本身的数据类型
System.out.println("s1 = " + s1);
//实际应用开发中,如果使用变量实现+2的操作,有哪些方式
//方式一: num = num + 2;
//方式二: num += 2;(推荐)
//实际应用开发中,如果使用变量实现+1的操作,有哪些方式
//方式一: num = num + 1;
//方式二: num += 1;
//方式三: num++; ((推荐))
}
}
//练习1
int i = 1;
i *= 0.1;// *= 赋值 不会改变变量本身的数据类型的
System.out.println("i = " + i);//0
i++;
System.out.println(i);//1
//练习2
int m = 2;
int n = 3;
n *= m++;// n = n * m++
System.out.println("m=" + m);//3
System.out.println("n=" + n);//6
//练习3
int n1 = 10;
n1 += (n1++) + (++n1); //n1 = n1 + (n1++) + (++n1) = 10 + 10(此时自增1,变11)+12=32
System.out.println(n1);//32
//练习4
//随意给出一个4位整数,打印显示它的个位数、十位数、百位数、千位数的值
int num4 = 2893;
System.out.println("个位数: " + (num4 % 10));
System.out.println("十位数: " + (num4 % 100 / 10));
System.out.println("百位数: " + (num4%1000/100));
System.out.println("千位数: " + (num4/1000));
码上见:
package com.rucoding.d4;
/**
* @author LiuYiXin
*
*/
public class CompareDemo01 {
public static void main(String[] args) {
//比较运算符
int i = 10;
int j = 20;
System.out.println(i == j);//false
System.out.println(i = j); //赋值操作 20
boolean b1 = true;
boolean b2 = false;
System.out.println(b2 == b1); //false
System.out.println(b2 = b1); //true
}
}
小结: 比较运算符的结果是boolean类型,true 或者 false。注意区分 == 判断等于 ,=赋值操作。
逻辑与&、短路与&&(或者称之为单与,双与)、逻辑或|、短路或||(或者称之为单或、双或)。
逻辑与&、短路与&&,逻辑或|、短路或|| 区别
package com.rucoding.d4;
/**
* @author LiuYiXin
*
*/
public class LogicDemo01 {
public static void main(String[] args) {
//逻辑运算符 &—逻辑与 |—逻辑或 !—逻辑非 &&—短路与 ||—短路或 ^—逻辑异或
//逻辑运算符操作的都是boolean的变量
//①.& 逻辑与 && 短路与 (短路)
//相同点: &、&& 的最终运行结果是相同的,两边都为true的时候结果才会为true
//相同点: 当左边为true的时候, &、&&单双与 都会执行右边的运算。
//不同点: 当左边为false的时候,&单与会继续执行右边的运算, &&双与(即短路与)不会执行右边的运算
//实际开发中,推荐使用&&
boolean b1 = true;
b1 = false;
int num1 = 10;
if(b1 & (num1++ > 0)){
System.out.println("我现在在北京");
}else{
System.out.println("我现在在南京");
}
System.out.println("num1 = " + num1);
boolean b2 = true;
b2 = false;
int num2 = 10;
if(b1 && (num2++ > 0)){
System.out.println("我现在在北京");
}else{
System.out.println("我现在在南京");
}
System.out.println("num2 = " + num2);
//②.| 逻辑或 || 短路或 (短路)
//相同点: |、|| 逻辑或、短路或 最终运算结果都是相同的,有一个为true,结果为true
//相同点: 当左边运算结果是false的时候,无论逻辑或|、短路或 ||两边都会执行右边运算
//不同点: 当左边运行结果为true的时候, 逻辑或| 会继续执行右边的运算, 短路或||不会执行右边的运算
//实际开发中,推荐使用||短路或
boolean b3 = false;
b1 = true;
int num3 = 10;
if(b3 | (num3++ > 0)){
System.out.println("我现在在北京");
}else{
System.out.println("我现在在南京");
}
System.out.println("num3 = " + num3);
boolean b4 = false;
b4 = true;
int num4 = 10;
if(b4 || (num4++ > 0)){
System.out.println("我现在在北京");
}else{
System.out.println("我现在在南京);
}
System.out.println("num4 = " + num4);
}
}
小结:
9、逻辑运算符练习题
代码演示:
package com.rucoding.d4;
/**
* @author LiuYiXin
*
*/
public class LogicDemo02 {
public static void main(String[] args) {
//练习1
int xx1 = 1;
int yy1 = 1;
if(xx1++ == 2 & ++yy1 == 2){
xx1 = 7;
}
System.out.println("xx1=" + xx1 + ",yy1=" + yy1); //2,2
//练习2
int x1 = 1;
int y1 = 1;
if(x1++ == 2 && ++y1 ==2){
x1 = 7;
}
System.out.println("x1=" + x1 + ",y1=" + y1); //2,1
//练习3
int x2 = 1;
int y2 = 1;
if(x2++ == 1 | ++y2 ==1){
x2 = 7;
}
System.out.println("x2=" + x2 + ",y2=" + y2);//7,2
//练习4
int x3 = 1,y3 = 1;
if(x3++ == 1 || ++y3 == 1){
x3 = 7;
}
System.out.println("x3=" + x3 + ",y3=" +y3);//7,1
//综合练习
boolean x = true;
boolean y = false;
short z = 42;
// if(y == true)
if((z++ == 42) && (y = true)) z++; //44
if((x = false) || (++z == 45)) z++;//46
System.out.println("z=" + z);
}
}
三元(三目)运算符描述:
代码演示:
package com.rucoding.d4;
/**
* @author LiuYiXin
*
*/
public class SanYuanDemo01 {
public static void main(String[] args) {
//三元运算符。结构: (条件表达式) ? 表达式1 : 表达式2
//说明: 条件表达式的结果为boolean类型
//①.根据条件表达式的真或假,决定执行 表达式1 还是 表达式2 (条件表达式结果为true 执行 表达式1 ,否则,执行 表达式2)
//②.表达式1 和 表达式2 返回结果是可以接收的同一类型。
//③.三元运算符可以嵌套使用
//1、获取两个整数的较大值
int m = 12;
int n = 5;
int max = (m > n) ? m : n;
System.out.println(max);
double num = (m > n) ? 2 : 1.0;//
System.out.println(num);
//嵌套使用
n = 12;
String result = (m > n) ? "m大" : (m == n) ? "m和n相等" : "n大";
System.out.println(result);
//2、获取三个数中最大值
int n1 = 12;
int n2 = 30;
int n3 = -24;
int maxOne = (n1 > n2) ? n1 : n2;
maxOne = (maxOne > n3) ? maxOne : n3;
System.out.println(maxOne);
//改写成 if-else
if(m > n){
System.out.println("m大");
}else{
System.out.println("n大");
}
//改写成 if-else
if(n1 > n2){
if(n1 > n3){
System.out.println("n1最大");
}else{
System.out.println("n3最大");
}
}else{
if(n2 > n3){
System.out.println("n2最大");
}else{
System.out.println("n3最大");
}
}
}
}
结论:
1. 位运算符操作的都是整型的数据
2. << :在一定范围内,每向左移1位,相当于 * 2
>> :在一定范围内,每向右移1位,相当于 / 2
面试题:最高效方式的计算2 * 8 ? 2 << 3 或 8 << 1
貌似可以解释一下这个问题: 2 表示的二进制 ...010 ,此时向左移动 3 位, 即 ...010 000 (向左移动3位,补上2位) ,结果即是2^4=16。
代码演示:
package com.rucoding.d4;
/**
* @author LiuYiXin
*
*/
public class BinaryDemo01 {
public static void main(String[] args) {
int i = 21;
i = -21;
System.out.println("i << 2 为 " + (i << 2));
System.out.println("i << 3 为 " + (i << 3));
System.out.println("i << 27 为 " + (i << 27));
int m = 12;
int n = 5;
System.out.println("m & n 为 " + (m & n));
System.out.println("m | n 为 " + (m | n));
System.out.println("m ^ n 为 " + (m ^ n));
//练习: 交换两个变量的值
int num1 = 10;
int num2 = 20;
//方式一: 定义临时变量;通用的数据类型, 推荐使用的
int temp = num1;
num1 = num2;
num2 = temp;
System.out.println("num1 = " + num1 + ",num2 = " +num2);
//方式二: 这个弊端,相加的操作数可能会超出存储范围 ; 局限性,只能适用于数字 (数值)类型
// num1 = num1 + num2;
// num2 = num1 - num2;
// num1 = num1 - num2;
// System.out.println("num1 = " + num1 + ",num2 = " +num2);
//方式三: 使用位运算符
//弊端: 只能适用于数字(数值)类型
// num1 = num1 ^ num2;
// num2 = num1 ^ num2;
// num1 = num1 ^ num2;
// System.out.println("num1 = " + num1 + ",num2 = " +num2);
}
}
按照如下思维导图,进行回顾并补充。
运算符有不同的优先级,所谓优先级就是表达式运算中的运算顺序。如表,上一行运算符总优先于下一行。
只有单目运算符、三元运算符、赋值运算符是从右向左运算的。