1.运算符介绍
运算符分类
2.算数运算符
- 二元运算符:+、-、*、/、%
整数运算:
(1)如果两个操作数有一个为long,则结果也为long;
(2)没有long时,结果为int,即使操作数全为short、byte,结果也是int。
浮点运算:
(1)如果两个操作数中有一个为double,则结果为double;
(2)只有两个操作数均为float,结果才为float。
取模运算:操作数可以是浮点数,但一般使用整数,结果是“余数”,“余数”符号和左边操作数相同,如7%3=1,-7%3=-1,7%-3=1。 - 一元运算符:++,--
byte a = 1;
int b = 2;
long b2 = 3;
//byte c = a + b; //报错,不能把int类型赋给byte,报错
//int c2 = b2 + b; //报错,不能把long类型赋给int,报错
//float f1 = 3.14; //报错,3.14默认为double类型
double d = b +b2; //不报错,表述范围从小到大时可以自动类型转换
//float d2 = f1 +6.2; //报错,不能把double类型赋给float
System.out.println(-9%5); //-4
int a = 3;
int b = a++; //先给b赋值,a再自增
System.out.println("a="+a+"\nb="+b); //a=4,b=3
a = 3;
b = ++a; //a先自增,再给b赋值
System.out.println("a="+a+"\nb="+b); //a=4,b=4
3.赋值运算符及其扩展运算符
- 赋值运算符:=
- 扩展运算符:+=、-=、*=、/=、%=、
举例:
a+=b相当于a=a+b
a=b+3相当于a=a(b+3)
4.关系运算符
关系运算符的结果是布尔值,true或false。关系运算符
(1)==和!=是所有(基本和引用)数据类型都可以使用;
(2)>、>=、<、<=仅针对数值类型以及char类型。
char b = 'a';
char b2 = 'c';
System.out.println((int)b); //97
System.out.println(0+b2); //99
System.out.println(b<b2); //true
5.逻辑运算符
逻辑运算符
注:短路与和短路或采用短路的方式,从左到右计算,如果只通过运算符左边的操作数就能确定该逻辑表达式的值,则不会继续计算运算符右边的操作数,提高效率。实际应用中,短路与和短路或更常用。
boolean b1 = true;
boolean b2 = false;
System.out.println(b1&b2);
System.out.println(b1|b2);
System.out.println(b1^b2);
System.out.println(!b1);
//boolean b3 = 1>2&2<(3/0); //报错,除数不能为0
boolean b3 = 1>2&&2<(3/0); //短路与,第一个操作数的值为false,则不需要再计算后面的操作数
System.out.println(b3); //false
6.位运算符
位运算符
(1)&和|既是逻辑运算符,也是位运算符。如果两侧操作数都是boolean类型,就作为逻辑运算符;如果两侧操作数均为整数类型,就是位运算符。
(2)^不是乘方运算,而是“异或”操作。
int a = 3;
int b = 4;
System.out.println(a&b); //0
System.out.println(a|b); //7
System.out.println(a^b); //7
System.out.println(~a); //-4
int c = 3<<2; //左移两位,相当于乘4
System.out.println(c); //12
System.out.println(12>>1); //6,右移一位,相当于除以2
7.字符串连接符
- 当+两边是数字时,表示加号;当+两边只要有一个为字符串时,它就表示字符串连接符。
String a = "3";
int b = 4;
int c = 5;
char d = 'a';
System.out.println(a+b); //34
System.out.println(a+b+c); //345
System.out.println(b+c+a); //93
System.out.println(d+4); //97+4=101
注:双引号表示字符串,单引号表示char。
8.条件运算符
语法格式:x ? y : z
其中x为boolean类型表达式,x为true则返回y,否则返回z,可以代替简单的if...else...
int score = 80;
int x = -100
String type = score<60?"不及格":"及格";
System.out.println(type); //及格
//等价于
if(score<60){
System.out.println("不及格");
}else{
System.out.println("及格");
}
System.out.println(x > 0 ? 1 : (x == 0 ? 1 : -1)); //-1
9.运算符的优先级
运算符的优先级
(1)总的来说,算术运算符>关系运算符>逻辑运算符>条件运算符>赋值运算符;
(2)不需要死记硬背,优先使用小括号来组织表达式;
(3)逻辑运算符中,逻辑非>逻辑与>逻辑或。比如,a||b&&c的运算结果是a||(b&&c),而不是(a||b)&&c。
10.自动类型转换
- 自动类型转换:指的是容量小的数据类型可以自动转换为容量大的数据类型。
注:容量小/大指的不是字节大小,而是数据类型表示的范围,比如虽然long占8个字节,float占4个字节,但float表示的范围比long大,所以long可以自动转换为float。 -
如下图所示,实线表示无数据丢失的自动类型转换,而虚线表示在转换时可能会有精度的损失。自动类型转换
- 可以将整型常量直接赋给byte、short、char等类型变量,而不需要进行强制类型转换,只要不超出其表数范围即可。
int a = 324;
long b = a;
double d = b;
//a = b; //报错,long类型不能转int
//long e = 3.24; //报错,double类型不能转long
//long e = 3.24F; //报错,float类型不能转long
float f = 234234L; //不报错,long类型可以转float
//特例
byte b2 = 123; //不报错
byte b2 = 1230; //报错,1230超过byte的表数范围
11.强制类型转换
注:可能会损失精度。
double x = 3.14;
int nx = (int)x;
System.out.println(nx) //3,自动舍去小数部分
char c = 'a';
int d = c+1;
System.out.println(d); //98
System.out.println((char)d); //b
12.类型转换时的常见问题
- 操作比较大的数时,要留意是否溢出;
- 不要命名名字为l的变量,l容易与1混淆,long类型使用大写L,不要用小写。
int money = 1000000000; //10亿
int years = 20;
int total = money*years;
System.out.println(total); //-1474836480,超过int范围,发生了溢出
long total1 = money*years;
System.out.println(taotal1); //-1474836480,默认是int,再转为long,但已超过int范围,发生了溢出
long total2 = money*((long)years);
System.out.println(total2); //2000000000,正确
long total3 = 34L*54346*money;
System.out,println(total3); //正确
13.使用Scanner获取键盘输入
import java.util.Scanner;
Scanner scanner = new Scanner(System.in);
System.out.println("请输入名字:");
String name = scanner.nextLine();
System.out.println("请输入你的爱好:");
String favor = scanner.nextLine();
System.out.println("请输入你的年龄:");
String age = scanner.nextInt();
System.out.println("######################");
System.out.println(name);
System.out.println(favor);
System.out.println("来到地球的天数:"+age*365);
System.out.println("离开地球的天数:"+(72-age)*365);