三、 java运算符与流程控制
赋值运算
赋值运算符:=,+=,-=,×=,/=,%=
class fuzhiyunsuan{ public static void main(String[] args){ int i1 = 10; i1 += 3;//即i1 = i1 +3,但是这两者是有区别的 //例如下面 short s = 10; //s = s + 3;编译是无法通过的,会损失精度 //s = (short)(s + 1);//强制修改精度,不建议 s += 1;//即可以实现运算,又不会更改s的数据类型; System.out.println(s); /* 赋值运算符:=,+=,-=,×=,/=,%= */ //切记在java中=是赋值操作。 boolean b1 = false; if(b1=true) System.out.println("结果为真"); else System.out.println("结果为假"); } }
root@debian:/home/jeff/java_coding/day003# java fuzhiyunsuan 11 结果为真
因为使用i = i+1可能无法通过编译,所以使用+=的方式赋值更好一些。还有在java中=是赋值,判断相等使用==。
逻辑运算符
class logiccal{ public static void main(String[] args){ boolean a = true; boolean b = false; System.out.println(a & b); System.out.println(a && b); System.out.println(a | b); System.out.println(a || b); System.out.println(!a & b); System.out.println(a ^ b); } }
root@debian:/home/jeff/java_coding/day003# java logiccal false false true true false true
&与&&的区别
&&是短路运算的与,即a&&b,当a为false是无论b是真还是假,结果都是假,故不再运行b,直接跳出计算。
class logicdiff{ public static void main(String[] args){ boolean b = false; int i1 = 10; if(b & (i1++) > 0){ System.out.println("good"); }else{ System.out.println("bad"); } System.out.println(i1); int i2 = 10; if(b && (i2++) > 0){ System.out.println("good"); }else{ System.out.println("bad"); } System.out.println(i2); } }
root@debian:/home/jeff/java_coding/day003# java logicdiff bad 11 bad 10
在此处即&左边为false,右边i++依然计算了,结果+1,&&右边未+1。更建议使用&&。
class logicdiff{ public static void main(String[] args){ boolean b = false; int i1 = 10; if(b & (10 / 0 == 0){ System.out.println("good"); }else{ System.out.println("bad"); } System.out.println(i1); int i2 = 10; if(b && 10/0 == 0){ System.out.println("good"); }else{ System.out.println("bad"); } System.out.println(i2); } }
此处&在编译过程中会报错,但是&&则会通过编译。
|与||同理。
位运算
class bitcal{ public static void main(String[] args){ int i1 = 31; System.out.println(i1<<3); System.out.println(i1<<28); System.out.println(i1>>2); System.out.println(i1>>>2); int i2 = -31; System.out.println(i2>>2); System.out.println(i2>>>2); } }
root@debian:/home/jeff/java_coding/day003# java bitcal
248
-268435456
7
7
-8
1073741816
位移运算可能导致精度丢失。无符号位运算在负数时变化较大。
两个变量换位问题
class exchange{ public static void main(String[] args){ int m = 111; int n = 233; System.out.println("m:"+m+"n:"+n); //1.提供中间变量 int temp = m; m = n; n = temp; System.out.println("m:"+m+"n:"+n); //2.m,n较大可能会损失精度 m = m+n; n = m-n; m = m-n; System.out.println("m:"+m+"n:"+n); //3.位运算 m = m^n; n = m^n; m = m^n; System.out.println("m:"+m+"n:"+n); } }
运行结果
root@debian:/home/jeff/java_coding/day003# java exchange m:111n:233 m:233n:111 m:111n:233 m:233n:111
三元表达式
格式:(条件表达式)?表达式1:表达式2;
当条件表达式为真,则运算结果为表达式1,当条件表达式为假,则运算结果为表达式2。
表达式1和2应当为同种类型。
三元表达式与if判断的差别为,三元表达式简化了if语句,三元表达式必须返回一个结果,if后面的代码快可以有多个语句。
class sanyuan{ public static void main(String[] args){ int i = 10; int j = 20; int max = (i > j)?i:j; System.out.println("较大值是"+max); String str = (i > j)?"i大":(i == j)?"相等":"j大"; System.out.println(str); } }
运算结果
root@debian:/home/jeff/java_coding/day003# java sanyuan
较大值是20
j大
流程控制
顺序结构
程序自上而下,逐行运行。
分支结构
根据条件选择某条分支运行
循环结构,根据循环条件重复性的执行某段代码。
if语句的三种格式
if(true){执行代码块;}
if(条件表达式){执行代码块;} else{执行代码块;}
if(条件表达式){执行代码块;} else if(条件表达式){执行代码块;} 。。。 else{执行代码块;}
import java.util.Scanner; class score{ public static void main(String[] args){ //创建一个scanner对象,用于键入数字 Scanner uscore = new Scanner(System.in); System.out.println("请输入考试成绩"); //调用此对象相应方法,完成键盘输入的值的获取 //next():表示从键盘获取一个字符串,int表示键入的是整型数值用于比较 int str = uscore.nextInt(); System.out.println("你的成绩是"+str); if(str > 100 || str < 0){ System.out.println("你输入的成绩有误"); } else{ if(str == 100){ System.out.println("第一名"); }else if(str > 80 && str<=99){ System.out.println("优秀"); }else if(str >=60 && str<= 80){ System.out.println("一般"); }else{ System.out.println("要加油啊"); } } } }
root@debian:/home/jeff/java_coding/day003# java score 请输入考试成绩 13 你的成绩是13 要加油啊 root@debian:/home/jeff/java_coding/day003# java score 请输入考试成绩 100 你的成绩是100 第一名 root@debian:/home/jeff/java_coding/day003# java score 请输入考试成绩 76 你的成绩是76 一般
switch语句
switch(变量){ case 值1: case 值2: ... default: }
class switch1{ public static void main(String[] args){ int i = 1; switch(i){ case 0: System.out.println("零"); case 1: System.out.println("一"); case 2: System.out.println("二"); default: System.out.println("其他"); } } }
运行结果
root@debian:/home/jeff/java_coding/day003# java switch1
一
二
其他
没有break退出循环体,那么匹配到分支以后还会继续执行其下的case语句。
default是可选的,而且位置是灵活的。
class switch2{ public static void main(String[] args){ int i = 5; switch(i){ default: System.out.println("其他"); case 0: System.out.println("零"); case 1: System.out.println("一"); case 2: System.out.println("二"); } } }
运行结果
root@debian:/home/jeff/java_coding/day003# java switch2
其他
零
一
二
class switch3{ public static void main(String[] args){ int i = 5; switch(i){ default: System.out.println("其他"); break; case 0: System.out.println("零"); break; case 1: System.out.println("一"); break; case 2: System.out.println("二"); break; } } }
root@debian:/home/jeff/java_coding/day003# java switch3
其他
switch里的变量类型可以是:char,byte,short,int,枚举,String(jdk1.7)
case的条件只能是值不能是取值范围。
注意:
1. 取模的结果的符号取决于被模数,忽略模数的符号;
2.java的if(x=1){}的判断语句中如此赋值会报错,而不是与Python一样认同为条件为真,原因是java的Boolean类型只有两个值,不能是0和1.
附:
原码、反码、补码
这里以java的byte类型来说明。
八位二进制数的最高位是符号位,0为正数,1为负数,byte的范围是:-128~127。
计算机底层存储都是补码形式,正数:原码、反码、补码都一样。负数则需要进行换算,比如在计算机底层存了一个1101 0011,这是一个负数的补码,所以先逆推出他的反码即补码-1=反码,反码就是1101 0010,通过反码再求出原码,原码=反码除符号位以外逐位取反,所以它的原码就是1010 1101,所以这个底层存的数值就是-45。
存在一个问题0000 0000 与1000 0000都是0,+0与-0定义重复了,实际上1000 0000实际值是-128:
1000 0001 : 这是补码 ->反码 1000 0000 -> 原码:1111 1111 -127