运算符(operator)
整数运算:
- 如果两个操作数有一个为Long,则结果也为Long
- 没有Long时,结果为int。即使操作数全为short,byte,结果也是int。
浮点运算:
- 如果两个操作数有一个为double,则结果为double。
- 只有两个操作数都是float,则记过才为float。
取模运算:
其操作数可以为浮点数,一般使用整数,结果是“余数”,“余数”符号和左边操作数相同;如:7%3=1,-7%3=-1,7%-3=1 。
算术运算符中++(自增),--(自减)属于一元运算符,该类运算符只需要一个操作数。
int a = 3;
int b = a++;//此时先赋值再自增
System.out.println("a="+a+",b="+b);//此时a = 4,b = 3;
int c = 3;
int d = ++a;//此时先自增再赋值
System.out.println("c="+c+",d="+d);//此时c = 4,d = 4;
//自减则同理
int e = 3;
int f = e--;//此时先赋值再自减
System.out.println("e="+e+",f="+f);//此时e = 2,f = 3;
int g = 3;
int h = --g;//此时先自减再赋值
System.out.println("g="+g+",h="+h);//此时g = 2,h = 2;
赋值、赋值扩展运算符
public class TestOprator{
public static void main(String[] args){
int a1 = 3;
int b1 = 4;
a1+ = b1;//同理a1 = a1+b1;
System.out.println(a1);
int a2 = 3;
int b2 = 4;
a2- = b2;//同理a2 = a2-b2;
System.out.println(a2);
int a3 = 3;
int b3 = 4;
a3* = b3;//同理a3 = a3*b3;
System.out.println(a3);
int a4 = 9;
int b4 = 4;
a4/ = b4;//同理a4 = a4/b4;
System.out.println(a4);
int a5 = 9;
int b5 = 4;
a5% = b5;//同理a5 = a5%b5;
System.out.println(a5);
}
}
关系运算符
关系运算符用来进行比较运算,关系运算的结果是布尔值:true/false;
注意事项
- =是赋值运算符,而真正判断两个操作数是否相等的运算符是==;
- ==、!=是所有(基本和引用)数据类型都可以使用的;
- >、>=、<、<=仅针对数值类型(byte/short/int/Long,float/double以及char)。
public class TestOperator{
public static void main(String[] args){
int a = 3;
int b = 4;
char c = 'h';
boolean d = true;
d = a==b;//等于
System.out.println(d);
d = a!=b;//不等于
System.out.println(d);
d = a>b;//大于
System.out.println(d);
d = a<b;//小于
System.out.println(d);
d = a>=b;//大于等于
System.out.println(d);
d = a<=b;//小于等于
System.out.println(d);
d = c>100;//char值位于0-65535之间,通过(int)强制转换为int类型,可以看到对应的数字
System.out.println((int)c);
System.out.println(d);
}
}
逻辑运算符
逻辑运算的操作数和运算结果都是boolean值。
短路与和短路或采用短路的方式。从左到右计算,如果只通过运算符左边的操作数就能够确定该逻辑表达式的值,则不会继续计算运算符右边的操作数,提高效率。
public class TestOperator{
public static void main(String[] args){
boolean t1 = true;
boolean t2 = false;
System.out.println(t1 & t2);//false,两个操作数为true,结果才是true,否则是false
System.out.println(t1 | t2);//true,两个操作数有一个为true,结果就是true
System.out.println(!t1);//false,取反,false为true,true为false
System.out.println(t1 ^ t2);//true,相同为false,不同为true
//短路与、短路或
boolean b;
b = 1>2 && (4<3/0);
System.out.println(b);//false,只要有一个为false,则直接返回false
b = 1<2 && (4<3/0);
System.out.println(b);//true,只要有一个为true,则直接返回true
}
}
位运算符
位运算指的是进行二进制的位运算。
public class TestOperator{
public static void main(String[] args){
int a;
int b;
a=3;
b=4;
System.out.println(~a);//
System.out.println(a & b);//
System.out.println(a | b);//
System.out.println(a ^ b);//
//移位
System.out.println(a << b);//相当于3*4*4*4*4=768
//System.out.println(a >> b);//相当于3/4/4/4/4
}
}
字符串连接符
“+”运算符两侧的操作数中只要有一个是字符串(String)类型,系统会自动将里一个操作数转换为字符串然后再进行连接。
public class TestOperator{
public static void main(String[] args){
String a = "3";
int b = 4;
System.out.println(a+b);//结果:34
//条件是String,不是char,为char时,任然是加号不是连接符
char c1 = 'h';
char c2 = 'i';
System.out.println(""+c1+c2);
}
}
条件运算符
语法格式:
x ? y : z
public class TestOperator{
pubilc static void main(String[] args){
int score = 60;
int x = -100;
String type = score<60?"不及格":"及格";
/*
if(score<60){
type = "不及格";
}else{
type = "及格";
}
*/
int flag = x>0?1:(x==0?0:-1);
System.out.println("type="+type+"/nflag="+flag);
}
}
运算符优先级的问题
- 表达式里面优先使用小括号来组织
- 逻辑与、逻辑或、逻辑非的优先级一定要熟悉(逻辑非 > 逻辑与 > 逻辑或)
- a||b&&c的运算结果是:a||(b&&c),而不是(a||b)&&c
boolean s1 = true,s2 = true,s3 = false; System.out.pintln(s1||s2&&s3);//结果是teue //遇到复杂的逻辑运算用括号括起来 Ststem.out.println((s1||s2)&&(s3));//结果是false
数据类型的转换
自动类型转换指的是容量小的数据类型可以自动转换为容量大的数据类型。除了boolean类型外的七种类型是可以自动转化的。
public class TestAutoConvert{
public static void main(String[] args){
//从容量小的类型可以自动转化为容量大的类型
int a = 2345;
long b = a;
//int c = b;//long类型不能自动转为int
double d = b;
float f = b;
//特例:整型常量是int类型,但是可以自动转为:byte,short,char。
//只要不超过对应类型的表数范围即可。
byte h1 = 123;
//byte h2 = 1234;//1234超过了byte的表数范围[-128,127]
char h3 = 97+25;//char[0,65535]之间
System.out.println(h3);
}
}
强制类型转换
语法格式:
(type)var
public class TestTypeCast{
publci static void main(String[] args){
double a = 3.941526;
int b = (int)a;//b:3 浮点数强制转换成整数,则直接丢失小数部分(不会四舍五入)
int c = 97;
System.out.println((char)c);
//强制转型,超过了表数范围,则会转成一个完全不同的值。
byte d = (byte)300;
System.out.println(d);
}
}
基本类型转化时常见错误和问题
- 操作比较打的数是,要留意是否溢出,尤其是整数操作时。
public class TestTypeCast{
public static void main(String[] args){
//溢出问题
int money = 1000000000;
int years = 20;
//返回的total是负数,超过了int的表数范围
int total1 = money*years;
System.out.println("total1"+total1);
//返回的total2仍然是负数,因为money和years默认是int
//因此结果会转成int,再转成long,但是已近发生了数据丢失
lont total2 = money*years;
System.out.println("total2"+total2);
//返回的total3正确,先将一个因子变成long,整个表达式发生提升。全部用long来计算
long total3 = 1L*money*years;
//long total3 = money*((long)years);
//人的寿命是80岁,一生经历了多少次心跳
long num = 100L*60*24*365*80;
System.out.println("人的一生心跳次数:"+num);
}
}
简单的键盘输入和输出
import java.util.Scanner;
public class TestScanner{
public static void main(String[] args){
Scanner s = new Scanner(System.in);
//输入
System.out.println("输入您的用户名:");
String name = s.nextLine();
System.out.println("请输入您的年龄:");
int age = s.nextInt();
System.out.println("请输入您的月薪:");
int money = s.nextInt();
//输出
System.out.println("用户名:"+name+"/n年龄:"+age+"/n月薪:"+money);
}
}