1 运算符(续)
+-*/ |
|
+ |
字符串连接 |
% |
取余、求模 |
== |
相等 |
!= |
不相等 |
> >= < <= |
比较大小 |
&& |
逻辑与,左边是真,并且右边是真,结果是真 短路与,左边是假,右边忽略不执行 |
|| |
逻辑或,左边是真,或者右边是真,结果都是真 短路或,左边是真,右边忽略不执行 |
! |
非真是假,非假是真 判断“非a”是真,即a是假 if(! a) { } |
& |
位与 |
| |
位或 |
^ |
异或 对同一个值异或两次,得到原值 |
~ |
求反 |
>> |
带符号向右移位 向右移动1位,相当于/2 |
>>> |
不带符号向右移位 |
<< |
向左移位 向左移动1位,相当于*2 |
++ -- |
自增、自减 int a = 5 print(a++) 先取值再自增 1) 取a的原值等待打印 2) a自增变成6 3) 打印a的原值5 int a = 5 print(++a) 先自增再取值 1) a先自增变成6 2) 取得a的新值等待打印 3) 打印a的新值6 |
? : |
三项运算符 1 ? 2 : 3 1是真,取2的值 1是假,取3的值 |
= |
赋值运算 左侧必须是变量 |
+= /= &= >>= ... |
复合的赋值运算符 a = 5 a += 2 //a = a+2 会自动转型 byte a = 5; a = (byte) (a + 2); a += 2; a += 3.14 |
() |
转型 |
1.1 运算符的优先级
(1+(2-3))*4/5
l 优先级高低,不需要记
l 多加小括号
//能被4整除并且不能被100整除 //或者能被400整除 if((y%4==0 && y%100!=0) || y%400==0) { return true; }
1.2 位运算
int拆分四字节
import java.util.Scanner; public class Test1 { public static void main(String[] args) { System.out.print("输入整数:"); int n = new Scanner(System.in).nextInt(); System.out.println("--拆分成四个byte值-------------"); //把n的值传递到f1()方法进行拆分 //在f1()方法中,直接打印显示拆分结果 f1(n); } static void f1(int n) { /* * 11001101 10011110 11100100 10010011 * * n的值,右移24,16,8,0位,再强转成byte类型 */ byte b1 = (byte) (n>>24); byte b2 = (byte) (n>>16); byte b3 = (byte) (n>>8); byte b4 = (byte) (n>>0); System.out.println(b1); System.out.println(b2); System.out.println(b3); System.out.println(b4); /* 11001101 10011110 11100100 10010011 r 11001101 10011110 01100100 00000000 */ int r = 0; //字节值左移24再不带符号右移0,8,16,24 //与r求位或,结果再保存到r r = r | (b1<<24>>>0); r = r | (b2<<24>>>8); r = r | (b3<<24>>>16); r = r | (b4<<24>>>24); System.out.println(r); /* * 11111111 11111111 11111111 11001101 * 00000000 00000000 00000000 11111111 & * 00000000 00000000 00000000 11001101 * * 255 0xff 0x000000ff */ r = 0; //字节值与0x000000ff求位与, //左移24,16,8,0位,与r求位或, //结果再保存到r r = r | ((b1 & 0x000000ff) << 24); r = r | ((b2 & 0x000000ff) << 16); r = r | ((b3 & 0x000000ff) << 8); r = r | ((b4 & 0x000000ff) << 0); System.out.println(r); } }
三个整数最大值
import java.util.Scanner; public class Test1 { public static void main(String[] args) { System.out.println("输入三个整数:"); int a = new Scanner(System.in).nextInt(); int b = new Scanner(System.in).nextInt(); int c = new Scanner(System.in).nextInt(); //a,b,c三个整数的值, //传递到max()方法,求最大值 //得到方法的返回结果,保存到变量 m int m = max(a, b, c); System.out.println("最大值:" + m); } static int max(int a, int b, int c) { //求a,b的最大值保存到变量 max //求max,c的最大值,保存到 max //int max = a>b ? a : b; //max = max>c ? max : c; int max = a>b ? (a>c?a:c) : (b>c?b:c); return max; } }
3 流程控制
l if
l switch
l for
l while
l do-while
商品打折
package day0203; import java.util.Scanner; public class Test1 { public static void main(String[] args) { System.out.print("输入原价:"); double p = new Scanner(System.in).nextDouble(); //原价p的值,传递到discount()方法 //来计算折扣价, //得到方法的返回值,保存到变量 p p = discount(p); System.out.println("最终价格:"+p); } static double discount(double p) { //定义折扣率变量 r 1, 0.95, 0.9, 0.xx double r = 1; //根据原价参数p的范围, //来为r赋不同的值 if(p >= 5000) { r = 0.75; } else if(p >= 3000) { r = 0.8; } else if(p >= 1000) { r = 0.9; } else if(p >= 500) { r = 0.95; } //计算折扣价,并返回 return p*r; } }
4 if
package day0203; import java.util.Scanner; public class Test1 { public static void main(String[] args) { System.out.print("输入原价:"); double p = new Scanner(System.in).nextDouble(); //原价p的值,传递到discount()方法 //来计算折扣价, //得到方法的返回值,保存到变量 p p = discount(p); System.out.println("最终价格:"+p); } static double discount(double p) { //定义折扣率变量 r 1, 0.95, 0.9, 0.xx double r = 1; //根据原价参数p的范围, //来为r赋不同的值 if(p >= 5000) { r = 0.75; } else if(p >= 3000) { r = 0.8; } else if(p >= 1000) { r = 0.9; } else if(p >= 500) { r = 0.95; } //计算折扣价,并返回 return p*r; } }
package day0204; import java.util.Scanner; public class Test1 { public static void main(String[] args) { System.out.print("工资:"); double s = new Scanner(System.in).nextDouble(); //把s传递到 grsds()方法, //来计算个人所得税 //得到方法的返回值,保存到变量 tax double tax = grsds(s); System.out.println( "应缴纳个人所得税:"+tax); } static double grsds(double s) { //低于起征点,不交税 if(s <= 3500) { return 0; } //工资刨掉3500 s -= 3500; // s = s-3500; //定义税率变量r和速算扣除数变量k double r = 0; int k = 0; //根据s的范围,来确定r和k的值 if(s<=1500) { r = 0.03; k = 0; } else if(s<=4500) { r = 0.1; k = 105; } else if(s<=9000) { r = 0.2; k = 555; } else if(s<=35000) { r = 0.25; k = 1005; } else if(s<=55000) { r = 0.3; k = 2755; } else if(s<=80000) { r = 0.35; k = 5505; } else { r = 0.45; k = 13505; } return s*r - k; } }
5 switch
l 当一个case成立,从这个case向后无条件执行所有case包括default(穿透),直到结束,或者遇到break中断、跳出switch
l switch只能判断byte,short,char,int,
enum, jdk1.7后可以判断 String
switch(变量或表达式) {
case 50:
case 20:
break;//中断、跳出
case 90:
case 70:
default:
}
6 for
for(变量赋值; 执行条件; 变量修改) {
代码
}
// 1到10打印 for(int i=1; i<=10; i++) { System.out.println(i); }
阶乘
package day0208; import java.util.Scanner; public class Test1 { public static void main(String[] args) { System.out.print("输入整数求阶乘:"); int n = new Scanner(System.in).nextInt(); //n传递到 f() 方法求n的阶乘 //得到方法的返回值存到变量r long r = f(n); System.out.println(r); } private static long f(int n) { /* * 假设n是5 * * r = 5 * * i=4, r*=i * i=3, r*=i * i=2, r*=i * i=1, r*=i */ long r = n; for(int i=n-1; i>=1; i--) { r*=i; } return r; } }