3. Java运算符和语句
补充上一章的变量:
变量---可认为是一个程序执行的最小单位
变量的格式:数据类型 变量名称=初始值;
1.Java中的数据类型:
a)基本数据类型
byte short int long float double char boolean
b)复合数据类型
2.基本数据类型转换
a)Boolean布尔型不参与基本数据类型转换;
b)基本数据类型精度排序(小---大)
c)隐式数据类型转换【自动数据类型转换】
数据类型精度低的转换成数据类型精度高的这个过程就是隐式数据类型转换【自动数据类型转换】
格式:高类型 变量名称=低【值/变量】;
例:
public class DataType{
public static void main(String args[]){
//100 int型赋值给double,自动类型转换
int intnum1=100;
double dounum1=intnum1;
double dounum2=123;
System.out.println("dounum1="+dounum1+",dounum2="+dounum2);
}
}
输出为:
E:\学习记录\第三课 Java运算符-语句>javac DataType.java
E:\学习记录\第三课 Java运算符-语句>java DataType
dounum1=100.0,dounum2=123.0
d)显式数据类型转换【强制数据类型转换】
数据类型精度低的转换成数据类型精度高的这个过程就是隐式数据类型转换【自动数据类型转换】
格式:低类型 变量名称=(低)高【值/变量】;
例:
public class DataType{
public static void main(String args[]){
//精度高赋值给精度低的会报错
/*
double dounum3=13.14;
int intnum2=dounum3;
错误: 不兼容的类型: 从double转换到int可能会有损失
*/
//强制转换
double dounum3=13.14;
int intnum2=(int)dounum3;
int intnum3=(int)52.0f;
System.out.println("intnum2="+intnum2+",intnum3="+intnum3);
}
}
输出为:
E:\学习记录\第三课 Java运算符-语句>javac DataType.java
E:\学习记录\第三课 Java运算符-语句>java DataType
intnum2=13,intnum3=52
e) char与int
public class DataType{
public static void main(String args[]){
//chart 与int 转换
//自动类型转换
char char1='家';
int intnumb1=char1;
System.out.println("intnumb1="+intnumb1);//输出为23478
//强制类型转换
int intnumb2=23478;
char char2=(char)intnumb2;
System.out.println("char2="+char2);
}
}
输出为:
E:\学习记录\第三课 Java运算符-语句>javac DataType.java
E:\学习记录\第三课 Java运算符-语句>java DataType
intnumb1=23478
char2=家
f) int转换成byte
byte转换成int---隐式数据类型转换【自动数据类型转换】
int转换成byte---显式数据类型转换【强制数据类型转换】
例:
public class DataType{
public static void main(String args[]){
//byte转换成int---隐式数据类型转换【自动数据类型转换】
byte bytenum1=120;
int intnumtest1=bytenum1;
System.out.println("intnumtest1=="+intnumtest1);
//int转换成byte---显式数据类型转换【强制数据类型转换】
int intnumtest2=129;
byte bytenum2=(byte)intnumtest2;
System.out.println("bytenum2=="+bytenum2); //输出为-127
int intnumtest3=-130;
byte bytenum3=(byte)intnumtest3;
System.out.println("bytenum3=="+bytenum3); //输出为126
}
}
输出为:
E:\学习记录\第三课 Java运算符-语句>javac DataType.java
E:\学习记录\第三课 Java运算符-语句>java DataType
intnumtest1==120
bytenum2==-127
bytenum3==126
【超过范围规则】
- 当整数int转换成byte时,int取值正数超过byte范围以后,会从byte最小值向前推进计算。
- 当整数int转换成byte时,int取值负数超过byte范围以后,会从byte最大值向后推进计算。
比如129,超出127两个数,所以往负数那边走两个,得到-127;
比如-130,超出-128两个数,所以往右边正数走两个,得到126。
3.1 Java中的运算符
1)赋值运算符=
2)算术运算符
+ | - | * | / | % | ++ | -- |
加 | 减 | 乘 | 除 | 取余 | 自动加1 | 自动减1 |
【注意事项】
- /和%的区别:两个数据做除法,/取结果的商,%取结果的余数。整数操作只能得到整数,要想得到小数,必须有浮点数参与运算。
例:
public class YunSuanFu{
public static void main(String args[]){
int int1=100;
int int2=10;
int int3=3;
float float1=3f;
//+ 1.进行加法运算 2.连接符号
System.out.println(int1+"+"+ int2+"="+(int1+int2)); //110
System.out.println(int1+"-"+ int2+"="+(int1-int2)); //90
System.out.println(int1+"*"+ int2+"="+(int1*int2)); //1000
System.out.println(int1+"/"+ int2+"="+(int1/int2)); //10
//两个数据做除法,/取结果的商,%取结果的余数
System.out.println(int1+"/"+ int3+"="+(int1/int3)); //33
System.out.println(int2+"/"+ float1+"="+(int2/float1)); //33.333333
System.out.println(int2+"%"+ int3+"="+(int2%int3)); //1
}
}
- 变量++【先用后加1】 ++变量 【先加1后用】
变量-- 【先用后减1】 --变量 【先减1后用】
例:
public class YunSuanFu{
public static void main(String args[]){
//变量++【先用后加1】,第二次在输出值会自动加1
System.out.println(int1++);//100
System.out.println(int1);//101
// ++变量 【先加1后用】
System.out.println(++int1);//102
System.out.println(int1);//102
//--同理
System.out.println(int1--);//102
System.out.println(int1);//101
System.out.println(--int1);//100
System.out.println(int1);//100
}
}
3)比较运算符
符号 | 说明 |
> | 判断是否大于,成立为true,不成立为false |
< | 判断是否小于,成立为true,不成立为false |
>= | 判断是否大于等于,成立为true,不成立为false |
<= | 判断是否小于等于,成立为true,不成立为false |
!= | 判断是否不等于,成立为true,不成立为false |
== | 判断是否等于,成立为true,不成立为false |
运算结果为boolean
例:
public class YunSuanFu{
public static void main(String args[]){
int a=15;
int b=20;
System.out.println(a+">"+b+"="+(a>b)); //false
System.out.println(a+"<"+b+"="+(a<b)); //true
System.out.println(a+">="+b+"="+(a>=b)); //false
System.out.println(a+"<="+b+"="+(a<=b)); //true
System.out.println(a+"=="+b+"="+(a==b)); //false
System.out.println(a+"!="+b+"="+(a!=b)); //true
}
}
输出为:
E:\学习记录\第三课 Java运算符-语句>javac DataType.java
E:\学习记录\第三课 Java运算符-语句>java DataType
15>20=false
15<20=true
15>=20=false
15<=20=true
15==20=false
15!=20=true
4)逻辑运算符
& | 逻辑与 | 有false则false |
| | 逻辑或 | 都false则false |
^ | 逻辑异或 | 相同为false,不同为true |
! | 逻辑非 | 相反 |
&& | 短路与 | 作用和&相同,但有短路效果 |
|| | 短路或 | 作用和|相同,但有短路效果 |
【注意事项】
- &&运算符号的左边结果为false时,右边不执行;
- ||运算符号的左边结果为true时,右边不执行;
例:
public class YunSuanFu{
public static void main(String args[]){
/*
逻辑运算符
*/
//&逻辑与,有false则false
int i=10;
int j=20;
int k=30;
System.out.println((i>j)&(i>k));//false&false 输出为false
System.out.println((i<j)&(i>k));//true&false 输出为false
System.out.println((i>j)&(i<k));//false&true 输出为false
System.out.println((i<j)&(i<k));//true&true 输出为true
//|逻辑或,都false则false
System.out.println((i>j)|(i>k));//false|false 输出为false
System.out.println((i<j)|(i>k));//true|false 输出为true
System.out.println((i>j)|(i<k));//false|true 输出为true
System.out.println((i<j)|(i<k));//true|true 输出为true
//^逻辑异或,相同为false,不同为true
System.out.println((i>j)^(i>k));//false^false 输出为false
System.out.println((i<j)^(i>k));//true^false 输出为true
System.out.println((i>j)^(i<k));//false^true 输出为true
System.out.println((i<j)^(i<k));//true^true 输出为false
//!与后面的结果相反
System.out.println((i>j));//false
System.out.println(!(i>j));//!false 即true
//&& ||
System.out.println((i>j)&& ((10/0)>1) ); //左边false,右边不执行,还是false
/*
左边true,右边执行,但右边除数不能0所以报错
Exception in thread "main" java.lang.ArithmeticException: / by zero
//System.out.println((i<j)&& ((10/0)>1) );
*/
System.out.println((i<j)|| ((10/0)>1) ); //左边true,右边不执行,还是true
}
}
5)位运算符
符号 | 名称 | 作用 |
~ | 取反 | 0和1相反 |
& | 按位与 | 相同1为1,不同为0 |
| | 按位或 | 全0为0,有1则1 |
^ | 按位异或 | 不同为1,相同为0 |
>> | 右移位 | 右移1位相当除2取商 |
<< | 左移位 | 左移1位相当于乘2 |
【注意】&和|既是逻辑运算符,也是位运算符。如果两侧操作数都是boolean型,就作为逻辑运算符。如果两侧的操作数是整数类型,就是位运算符。
运算规则:
位运算符需要将数据转换成二进制【00101010】数据进行运算
掌握十进制转二进制 :短除法[笨] 8421码转化法
【8421码转化法】
1024 512 256 128 64 32 16 8 4 2 1
7=4+2+1----- 0 0 0 0 0 0 0 0 1 1 1 --- 00000111
13=8+4+1---- 0 0 0 0 0 0 0 1 1 0 1 --- 00001101
负数的2进制:实质上补码表示
正数的补码是本身
负数的补码是反码+1
反码的表示方法是:
正数的反码是其本身【原码】
负数的反码是在其源码的基础上, 符号位不变,其余各个位取反。
源码就是符号位加上真值的绝对值,即用第一位表示符号, 其余位表示值。
比如:-7的2进制 (源码---反码---补码)
-7————7的2进制—00000111---[-7的源码]10000111-----[-7的反码]11111000---[-7的补码]11111001
① |按位或 全0为0,有1则1
【7|-7】
【7 】00000111
【-7】11111001
11111111【转十进制—开头为1为负数,负数的补码11111111---负数的反码减个1就是11111110----负数的源码10000001-----对应得正数二进制为000000001,所以十进制为-1】
② &按位与 相同1为1,不同为0
【7 & -7】
00000111
11111001
00000001
③ ^按位异或 不同为1,相同为0
【7 ^ -7】
00000111
11111001
11111110
④ ~取反
⑤<< 左移位 2进制整体向左移动指定的位数
⑥>> 右移位 2进制整体向右移动指定的位数
面试题:最有效率的方法算出2乘以8等于几? 2<<3; 表示2 向左移3位
代码演示:
public class YunSuanFu{
public static void main(String args[]){
System.out.println(7 | -7); //-1
System.out.println(7 & -7); //1
System.out.println(7 ^ -7); //-2
System.out.println(7<<2); //28
System.out.println(7>>2); //1
}
}
6)三元运算符
格式: 关系表达式 ? 表达式1:表达式2;
首先计算关系表达式的值,
如果值为true,表达式1的值就是运算结果;
如果值为false,表达式2的值就是运算结果。
例:
public class YunSuanFu{
public static void main(String args[]){
//三元运算符
//定义两个变量
int g = 10;
int h =20;
//获取两个变量中的最大值
int max=g>h ? g : h;
System.out.println("max="+max); //输出为max=20
}
}
3.2 java中的语句
- 顺序结构 【写好的代码从上往下一行一行的逐个执行】
- 选择结构【if语句 switch语句】
- if语句
public class IfDemo{
public static void main(String args[]){
//if(判断){java代码} 【只选对的】
//先执行判断,true时执行{java代码},false时不执行
/*
int code=59;
if(code>=60){
System.out.println("及格");
}
*/
//if(判断){java代码1}else{java代码1}【2选1】
//先执行判断,true时执行{java代码1},false时执行{java代码2}
/*
int code=59;
if(code>=60){
System.out.println("及格");
}else{
System.out.println("不及格");
}
*/
//if(判断1){java代码1}else if(判断2){java代码2}......else{java代码n}【多选1】
//先执行判断1,判断1true时执行{java代码1},false时执行判断2,判断2为true{java代码2}
//所有的判断都为false,则执行最后一个else中的{java代码n}
/*
int code=59;
if(code>=60 && code<79){
System.out.println("及格");
}else if(code>=80 && code<90){
System.out.println("良好");
}else if(code>=90 && code<=100){
System.out.println("优秀");
}else{
System.out.println("不及格或者有错!");
}
*/
/*
if(判断1){
if(判断2){
java代码1
}else{
java代码2
}
}else{
if(判断3){
java代码3
}else{
java代码4
}
}
if语句的嵌套
*/
//判断1为true,执行判断2,判断2为true时java代码1,判断2为false时java代码2
//判断1为false,执行判断3,判断3为true时java代码3,判断3为false时java代码4
int code=59;
if(code>=60){
if(code>=80){
System.out.println("优秀");
}else{
System.out.println("良好");
}
}else{
if(code>=0){
System.out.println("不及格");
}else{
System.out.println("不能为负数");
}
}
}
}
- switch语句
public class SwitchDemo{
public static void main(String args[]){
//switch语句
/*
switch(表达式){
case 常量值1: java代码1;[break;]
case 常量值2: java代码2;[break;]
case 常量值3: java代码3;[break;]
......
case 常量值n: java代码n;[break;]
default:java代码;[break;]
}
先执行表达式,表达式的结果与case后面的常量值匹配,
如果匹配结果相等,执行对应case后面的java代码,
如果有break就结束switch语句的执行。
如果没有break,那么执行下一个case对应的java代码,直到有break,结束
表达式的结果与所有case后面的常量值都不匹配,那么执行default后面的代码
注意1:表达式的类型可以是byte short char int long String[jdk8.0],枚举
注意2:有没有break,有break就结束执行,
没有break执行下一个case对应的java代码,直到有break
*/
int num1=10;
int num2=3;
char op='+';
switch(op){
case '+':System.out.println(num1+"+"+num2+"="+(num1+num2));
case '-':System.out.println(num1+"-"+num2+"="+(num1-num2));
case '*':System.out.println(num1+"*"+num2+"="+(num1*num2));break;
case '/':System.out.println(num1+"/"+num2+"="+(num1/num2));
default:System.out.println("运算有误!");