02 Java基础语法(变量+数据类型+运算符)(上):https://developer.aliyun.com/article/1580133
2.4 运算符
2.4.1 算数运算符
两个操作数进行计算
操作符 | 描述 |
+ | 加、求和 |
- | 减、求差 |
* | 乘、求积 |
/ | 除、求商 |
% | 模、求余 |
int n1 = 10; byte n2 =4; System.out.println(n1/n2); //2 //如果两个数字都是int整数,结果还是int整数 double r =n1/n2; System.out.println(r); //2.0 double r1 =(double)n1/n2; System.out.println(r1); //2.5
System.out.println(5.2%3); // 2.2 System.out.println(-5.2%3); // -2.2 System.out.println(3%5); //3 无法整除的,商0余3 System.out.println(6%10); // 6 System.out.println(-6%10); // -6 System.out.println(5%-10); // 5 System.out.println(1%10); // 1
//4687,求各个位上数字的和25 public static void main(String[] args) { int num = 4678; int ge = num%10; int shi = num/10%10; int bai = num/100%10; int qian = num/1000; int sum = ge +shi +bai +qian; System.out.println(sum); }
2.4.2 算数运算符:一元运算符
(只有一个操作数)
操作符 | 描述 |
++ | 递增,变量值+1 |
- - | 递减,变量值-1 |
int a = 3;int b = 4; int c = (++b)*2-(a--)%4+(a++)*5-(--b)/2+(--a); System.out.println(c); // 10-3%4+10-2+2 =17 //b=5 a=2 a=3 b=4 a=2
int i =10; i=i++; (int k = i++;i=k) i=i++; i=i++; System.out.println(i); //10
笔试考点
public class Demo { public static void main(String[] args) { //笔试考点 int a =10; int b = a ++; System.out.println("b = " + b); //ib = 10 System.out.println("a = " + a); //ia = 11 int c = ++a; System.out.println("c = " + c); //ic = 12 System.out.println("a = " + a); //ia = 12 System.out.println(a++ + ++a); //ia = 12+14=26 } }
2.4.3 赋值运算符
等号右边值赋值给等号左边的变量。
操作符 | 描述 |
= | 直接赋值 |
+= | 求和后赋值 |
-= | 求差后赋值 |
*= | 求积后赋值 |
/= | 求商后赋值 |
%= | 求余后赋值 |
//+=和+的区别 byte b = 127; b+=1; //输出-128 不会类型提升 b++; //输出-128 也不会类型提升 //b=b+1; //编译不通过,会类型提升Incompatible types. Found: 'int', required: 'byte'
注意:运算后赋值(复合运算)的,不会自动类型提升(++ – += -= /= %= *=)
2.4.4 关系运算符
两个操作数进行比较,结果是一个布尔值(true / false)。
操作符 | 描述 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
== | 等于 |
!= | 不等于 |
注意 float double 不要直接使用关系运算符比较(存储方式,精度丢失,近似存储,会出现误差)
用包装类double float提供的方法
2.4.5 逻辑运算符
两个boolean类型的操作数或表达式进行逻辑比较
操作符 | 语义 | 描述 |
&& | 短路与(并且) | 两个操作数,同时为真,结果为真 |
|| | 短路或(或者) | 两个操作数,有一个为真,结果为真 |
! | 取反(非) | 意为“不是”,真即是假,假即是真 |
int n1 =10; int n2 =8; System.out.println(n1<n2&&++n1>10); //false &&短路与之后的不执行 System.out.println(n1); //10 System.out.println(n1>n2||++n1>10); //ture ||短路或之后的不执行 System.out.println(n1); //10
前者false &&短路与之后的不执行
前者ture ||短路或之后的不执行
2.4.6 三元运算符
将判断后的结果赋,值给变量
操作符 | 语义 | 描述 |
? : | 布尔表达式?结果1:结果2 | 当表达式结果为真,获得结果1当表达式结果为假,获得结果2 |
int java = 87; String level = java>=90?"优秀":java>=80?"良好":"一般"; System.out.println(level); //或者直接sout嵌套 int java = 92; System.out.println(java>=90?"优秀":java>=80?"良好":"一般");
public class Demo { public static void main(String[] args) { //提示用户输入两个正整数并使用变量记录 System.out.println("请输入两个整数"); Scanner sc = new Scanner(System.in); int a =sc.nextInt(); int b =sc.nextInt(); //使用三目运算符找到最大值并打印 int max = a > b ? a : b; System.out.println("最大值是 " + max); System.out.println("最大值是 " + (a > ib ? a : b)); } }
2.4.7 位运算符(详细见7种位运算符Markdown)
对数值类型数据进行按位操作;1表示true、0表示false。
操作符 | 语义 | 描述 |
& | 按位与 | 二进制数据按位与操作 |
| | 按位或 | 二进制数据按位或操作 |
~ | 按位取反 | 二进制数据按位取反 |
^ | 按位异或 | 二进制数据异或,相同为假、不同为真 |
>> | 右移 | 二进制数据整体右移 |
<< | 左移 | 二进制数据整体左移 |
>>> | 无符号右移 | 二进制数据整体右移,符号位补0 |
public class Program { public static void main(String[] args) { int n1 = 6; //0000 0000 0000 0000 0000 0000 0000 0110 int n2 = 11; //0000 0000 0000 0000 0000 0000 0000 1011 System.out.println(n1&n2); //2(0010)二进制数据按位与操作 System.out.println(n1|n2); //15 (1111)二进制数据按位或操作 System.out.println(~n1); //-7 即转换为1111111111111111111111111111111111111111111111111111111111111001按位取反(补码存储) System.out.println(n1^n2); //13 (1101)按位异或,相同为假、不同为真 int n11 = 5; //0000 0000 0000 0000 0000 0000 0000 0101 int n22 = 7; //0000 0000 0000 0000 0000 0000 0000 0111 System.out.println(n11&n22); //5 (101)二进制数据按位与操作 System.out.println(n11|n22); //7 (111)二进制数据按位或操作 System.out.println(~n11); //-6 即转换为1111····1111 1010按位取反(补码存储) System.out.println(n11^n22); //2 (010--2)按位异或,相同为假、不同为真 //右移>>(相当于除2)左边补符号位 int n3 = 20; //二进制(1 0100) int n4=n3>>1; //10(01010) (最右右移1,最左补符号位,正数补0负数补1) int n5=n3>>2; //5(101) int n6=n3>>5; //0(移完了) int n7=n3>>32; //32的倍数,不变 //左移<<(相当于乘2)右边补0 //无符号右移>>>(相当于除2)左边补0 int n8 = 30; n8 = n8>>>1; //15 int n9 = -30; n9 = n9>>>1; //2147483633 } }
右移>>(相当于除2)左边补符号位
左移<<(相当于乘2)右边补0
无符号右移>>>(相当于除2)左边补0
public class Program01 { //1.有一个整数8747,获取这个整数的二进制后四位 //2.有一个整数8747,获取这个整数的二进制的第二个后四位 public static void main(String[] args) { int x = 8747; //0010 0010 0010 1011 System.out.println(x&0xF); //11 System.out.println(x>>>4&0xF);//2 } }
//面试题:不使用第三个变量交换两个数字 public class Demo { public static void main(String[] args) { int x =10;int y = 20; //加减法;缺点,如果数据大可能会出现溢出 x=x+y; y=x-y; x=x-y; //异或法 x=x^y; y=x^y; x=x^y; System.out.println("交换后"+x+" "+y); } }
2.4.7.1 字符串连接符:+
如果字符串和基本数据类型变量、常量连接以后,结果变成了字符串。
public class Demo1229 { public static void main(String[] args) { //提示用户输入一个正整数的秒数并使用变量记录 //提示用户输入正整数类型的秒数,拆分秒数后输出x小时x分x秒 System.out.println("请输入一个正整数的秒数:"); Scanner sc=new Scanner(System.in); int num=sc.nextInt(); //将正整数的秒数拆分为时分秒后并使用变量记录 //3666秒 =>1小时 1分钟 6秒钟 //3666 / 3600 = 1小时 3666%3600 =66 /60=1分钟 3666%60=6秒钟 int hour = num /3600; //拆分小时 int min = num % 3600 / 60; //拆分分钟 int sec = num % 60; //拆分秒钟 //打印最终的拆分结果 System.out.println("小时:" + hour + ",分钟:" + min + ",秒钟:" + sec); System.out.println("--------------------------------------------------------------------"); //+可以作为字符串连接,又可以作为加法运算符 //只要+两边的操作数中有一个操作数是字符串类型,则该+就被当做字符串连接符处理 System.out.println(hour + min +sec); //8 System.out.println(hour + min +sec+""); //8 System.out.println(hour + min +""+sec); //26 System.out.println(hour + ""+min +sec); //116 System.out.println(""+hour + min +sec); //116 System.out.println(""+(hour + min +sec)); //8 } }
2.4.8 运算符优先级
以下从上往下,优先级由高到低
操作符优先级 | 结合性 |
[ ] ( ) { } | 从左向右 |
! ~ ++ – -(负号) | 从右向左 |
* / % | 从左向右 |
+ - | 从左向右 |
<< >> >>> | 从左向右 |
< <= > >= instanceof | 从左向右 |
== != | 从左向右 |
& | 从左向右 |
^ | 从左向右 |
| | 从左向右 |
&& | 从左向右 |
|| | 从左向右 |
?: | 从右向左 |
= | 从右向左 |
优先级:
()优先级最高,赋值=优先级最低,算数大于关系,关系大于逻辑,乘除大于加减,短路与大于短路非
综合性:
大部分运算符从左向右结合,单目、三目、赋值结合性从右往左结合;
public class Demo1229 { public static void main(String[] args) { //单目 结合性 int a = 10; int b = -~++a; int c = (-(~(++a))); System.out.println(b); //12 System.out.println(c); //13 //三目 int java =88; String level1 =(java>=90?"优秀":(java>=80?"良好":"一般")); String level2 =java>=90?"优秀":java>=80?"良好":"一般"; System.out.println(level2); //++ --优先级 JVM栈,临时变量,还是先运算++ int num1 = 10; int num2 =num1++ ; System.out.println(num2);//10 System.out.println(num1);//11 } }
2.4.9 表达式
表达式:使用运算符连接的变量或字面值,并可以得到一个最终结果
2.5 控制台录入
控制台录入指的是通过键盘输入数据与程序之间进行交互
程序运行中,可在控制台(终端)手动录入数据,再让程序继续运行。
导包语法:import 包名.类名; //将外部class文件的功能引入到自身文件中。
步骤:
导入Scanner类,import java.util.Scanner,
创建Scanner类型的变量(对象)
使用Scanner类的方法
.nextInt(); //获得整数
.nextDouble(); //获得小数
.next(); //获得字符串
.ext().charAt(0);//获得单个字符 char x = input.next().charAt(0);
如果输入了不匹配的数据,则会产生 java.util.InputMismatchException
//格式类型 import java.util.Scanner; public class Demo { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("请输入一个整数"); int age = input.nextInt(); //int System.out.println("请输入一个小数"); double num = input.nextDouble(); //double System.out.println("请输入一个字符串"); String name = input.next(); //String System.out.println("请输入一个字符"); char x = input.next().charAt(0); //字符串char } }
//需求:控制台输入输出三门课程成绩,统计总分和平均分 import java.util.Scanner; public class Demo { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("请输入java成绩"); int java = input.nextInt(); System.out.println("请输入sql成绩"); int sql = input.nextInt(); System.out.println("请输入html成绩"); int html = input.nextInt(); System.out.println("总成绩为" + (java + sql + html)); System.out.printf("平均分是%.2f",(java + sql + html) / 3.0);//保留两位小数 System.out.printf("平均分是:"+"%.2f",(java + sql + html) / 3.0); } }
2.6 编码(补充)
tem.out.println(“请输入一个字符”);
char x = input.next().charAt(0); //字符串char
}
}
```java //需求:控制台输入输出三门课程成绩,统计总分和平均分 import java.util.Scanner; public class Demo { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("请输入java成绩"); int java = input.nextInt(); System.out.println("请输入sql成绩"); int sql = input.nextInt(); System.out.println("请输入html成绩"); int html = input.nextInt(); System.out.println("总成绩为" + (java + sql + html)); System.out.printf("平均分是%.2f",(java + sql + html) / 3.0);//保留两位小数 System.out.printf("平均分是:"+"%.2f",(java + sql + html) / 3.0); } }