运算符和表达式
运算符
在Java中用于程序计算的操作符统称为运算符,运算符分为如下几类
1、算术运算舒服
运算符 | 说明 | 例如 |
---|---|---|
+ | 两个数相加。可以运算,如果一边存在字符串,则当作连接符 | a+b |
- | 两个数相减,减号也可以表示负数 | a-b |
* | 两个数i相乘,其中*不能省略 | a*b |
/ | 两个数相除 | a/b |
% | 两个数取余 | a%b |
// 总结 ++ -- 的优先级高于 + ,-,*,、,%
public static void main(String [] args){
// + - * / % 所有运算符在计算式必须保证 数据类型一致
int num1 = 100;
int num2 = 200;
int sum = num1 + num2;
int mul = num1-num2;
int num3 = -num2; // -200
System.out.println("两个数相加" + sum); // + 表示连接符
System.out.println("两个数相减" + mul);
System.out.println( "num2: " + num2+ " ,num3:" + num3 );
System.out.println("num1+num2="+ (num1+num2) );
int sum2 = num1*num2;
int sum3 = num1/num3;
System.out.println(sum3); // 控制台输出的快捷键 sout+ enter
// System.out.println(num1/sum3); //算术异常:ArithmeticException: / by zero
// 取模
System.out.println( 10%2);//0
System.out.println(1%5);// 1
System.out.println(2%5);
}
public static void main(String[] args) {
// 自加 自减 ++ -- 只能对整数进行
int i=1;
i++ ; // i = i + 1
System.out.println("i:" + i);
int j=1;
++j; // j = j + 1
System.out.println("j:" + j);
int a =1;
int sum = a++; // 先将a的值赋值给sum ,a再自加1
int sum2 = ++a; // 先将a自加1 ,再将自加后的结果赋值给sum2
System.out.println("sum:" + sum);
System.out.println("sum2:" + sum2 );
System.out.println("a:" +a); // 3
int sum3 = a++ + a++ ;
System.out.println("sum3:"+sum3);
System.out.println("a:"+a);
// -- 操作 与++操作类似
int b=1;
int s1= b--; // b = b -1 s1 的值为 先赋值再自减1 s1 = 1
int s2 = --b; // b = b -1 s2 的值为 先自减1 ,再赋值 s2 = -1
System.out.println("b:"+b);
System.out.println("s1:"+s1);
System.out.println("s2:"+s2);
// ++ -- 综合
int x=1;
int y=2;
int s3 = x++ + --x * (y-- + ++x);
System.out.println("x:"+x);// 2
System.out.println("y:"+y);// 1
System.out.println("s3:"+s3);// 5
}
2、比较运算符
用于比较两个表达式之间的结果,结果返回 true,false
比较运算符 | ||
---|---|---|
> | 比较左边的数是否大于右边的数,如果大于返回true,否则返回false | a>b,3>5 |
< | 比较左边的书是否小于右边的数,如果小于返回true,否则返回false | a<b |
>= | 比较左边的数是否大于等于右边的数,如果大于或等于返回true,否则返回false | a>=b |
<= | 比较左边的数是否小于等于右边的数,如果小于或等于返回true,否则返回false | |
== | 比较==两边是否相等,如果相等返回true,否则返回false,对于基本数据类型比较数值是否相等,对于引用数据类型比较,他们的地址是否相等(变焦地址就是比较是否同一块内存) | 1==2 |
!= | 比较左边的数是否不等于右边的数,如果不相等返回true,否则返回false | 1!=2 |
注意: 不能连写 例如 1<3<5
public static void main(String[] args) {
// 比较运算符
int a =1;
int b =2;
// a>b; // 不能单独比较 必须接受结果或输出
System.out.println(a>b); //false
System.out.println(a<b); //true
System.out.println(a==b); //false
System.out.println(a!=b); //true
// 增加逻辑判断
// 如果 if 后面的条件成立, 则执行if里面的语句 ,如果不成立 则只需else语句
if(a>b){
System.out.println("a>b成立");
}else{
System.out.println("不成立");
}
}
3、赋值运算符
将表达式的结果赋值给一个变量,只能赋值给变量,不能赋值给常量
例如:a=3
赋值运算符 | 说明 | 案例 |
---|---|---|
= | 将=右边的结果 赋值给左边的变量 | int a=2,将2赋值给a |
+= | 计算后的赋值,将+=右边的结果赋值给左边的变量 | a+=2等价于a=a+2 |
-= | 计算后的赋值,将-=右边的结果赋值给左边的变量 | a-=b等价于a=a-b |
*= | 同上,将右边的结果赋值给左边的变量 | a=b等价于a=ab |
/= | 同上,将右边的结果赋值给左边的变量 | a/=b等价于a=a/b |
%= | 同上,将右边的结果赋值给左边的变量 | a%=b等价于a=a%b |
//赋值运算符 = += *= -= /= %=
int a=2;
a+=2;
System.out.println(a);
a-=3;
System.out.println(a);
a*=2;
System.out.println(a);
a/=4;
System.out.println(a);
a%=2;
System.out.println(a);
a+=a-=3;//a=a+(a-3)
System.out.println("a="+a);
int x=2;
x+=x-=x*=x++;
//x=x+(x=x-(x=x*(x++)))
//x=2+(2-4)
//x=0
System.out.println("x="+x);
int y=2;
y*=y+=y;
System.out.println(y);
4、逻辑运算符
在Java中用于两个或两个以上的表达式,去逻辑判断的结果,通常需要使用逻辑运算符
逻辑运算符 | ||
---|---|---|
& | 逻辑与,左右两边可以连接表达式,当两个表达式都成立时,整个结果为true | true&true 、 false&true false&false 、true&false |
| | 逻辑或,左右两边的表达式,任意一个成立,整个结果为true | |
! | 逻辑非 对表达式取反 | !false !true |
&& | 短路与,与&类似,特点:符号左边为false,右边不再运算 | true&&true true&&false |
|| | 短路或,与|类似,特点:符号左边为true,右边不再运算 | false||true false||false |
/ 逻辑运算符
System.out.println(true & true); // true
System.out.println(true & false);// false
System.out.println(false & true); // false
System.out.println(false & false);// false
// true&true
System.out.println(1>0 & 3>1);
System.out.println(1>0 && 3>1);
// | 或
System.out.println(true | true); //true
System.out.println(true | false);// true
System.out.println(false | true); // true
System.out.println(false | false);// false
// || 短路或
System.out.println(true || false) ;// true
总结:&与&&的区别 |与||的区别
问答1.&对于符号两边的表达式都会执行 &&符号左边为true,则右边不执行
|对于符号两边的表达式都会执行,||符号左边为true,则右边不执行
int a=1;
int b=2;
// System.out.println(a>b && b++>0); // 符号右边的不运算
// System.out.println("b:"+b);
System.out.println(a>b & b++>0); // 符号两边都运行
System.out.println("b:"+b);
// || 与 | 的区别
// System.out.println(a>=1 || a++<0); // a++ 不执行
// System.out.println("a:"+a);
System.out.println(a>=1 | a++<0 ); // a++ 会执行
System.out.println("再次输出a :" + a);
2、十进制转二进制
十进制 | 转换 | 二进制 |
---|---|---|
1 | 1*2的0次方 | 1 |
2 | 1*2的1次方 | 10 |
4 | 1*2的2次方 | 100 |
对于2的倍数,先查找理他最近的且比他小的2的倍数,然后插值再计算二进制(使用拆分发)例如28=16+8+4=11100 34=32+2=100010 96=64+32=1100000 | ||
16 | 1*2的4次方 | 10000 |
二进制转十进制
公式:从个位开始,每个位上的数*2的n次方来加之和
100100=1*2的2次方+1 * 2的5次方=36
5、移位运算符
移位运算符 | 说明 | 案例 |
---|---|---|
<< | 左移:将一个数转移成二进制之后,整体往左移动n位,扩大倍数,一个数向左移动n位,结果位这个数*2的n次方 | 3<<2=3*2的2次方 |
>> | 右移:将一个数转成二进制之后,整体往右移动n位,缩小倍数,一个数向右移动n位,结果位这个数除以2的n次方(除不尽单独考虑) | 8>>2-=8/2的2次方 |
>>> | 无符号的右移,不考虑符号位,将这个数整体往右移动n位 | |
^n | 异或 | |
-n | 数值取反 |
正数的移位:
//正整数的移位<< >> >>>
System.out.println(3<<2);//12
System.out.println(7<<3);//56
//对于整数的无符号右移和右移结果一杨
System.out.println(16>>2);//4
System.out.println(17>>2);//4
System.out.println(5^9);//12
System.out.println(3>>2);//0
System.out.println(3>>>2);//0
System.out.println(~5);
负数的移位
//负数的移位
//负数的左移位还是位负数
System.out.println(-4<<2);//-4*2的2次方
/**
* -4的原码:10000....00000100
* -4的反码:11111....11111011
* -4的补码:11111....11111100
* 开始移位:11111....11110000
*
* 取反: 10000....00001111
* 补码: 10000....00010000=-16
*/
//补码=反码+1
//负数是对于补码进行位移
System.out.println(-4>>1);//-4/2=-2
//-16无符号右移两位
System.out.println(-16>>>2);
//-16的补码算出来
/**
* 10000...00010000
* 反码11111...111011111
* 补码11111...111100000
* 00111...111111000由于不考虑符号,移动后高位全部补0变成正数
* 正数的原码和补码一致 这个数即为所得
* 1073741820
*/
System.out.println(~5);
//0000...00000101
//1111...11111010取反后成了负数 继续还原
//1000...00000101+1=
//1000...00000110=-6
6、三目运算符
表达式?结果1:结果2
当? 当?前面成立时, 整个表达式输出 结果1 ,如果?前面不成立,则输出结果2
//生成100以内的随机数
System.out.println(Math.random());
int n = (int)(Math.random()*100);
System.out.println("n:"+n);
System.out.println(n%2==0?"这个数是偶数":"这个数是奇数");
优先级 | 运算符 | 结核性 |
---|---|---|
1 | ()【】{} | 从左到右 |
2 | !+、-、++、-- | 从右到左 |
3 | *、/、% | 从左到右 |
4 | << 、>>、>>> | 从左到右 |
二、表达式
表达式通过运算符和操作数组成的元素,表达式不能单独写在程序中,需要接收结果或输出。
表达式
注意:这里的()表示方法的括号,点好表示小数点,[]表示数组的下标
2~5用于得到结果值
6~12用于运算得到true、false
13、14:是赋值,赋值的优先级最低
语句块:
在一个方法中,可以使用{}表示一个语句块
//定义一个方法中的代码块
{
//局部变量只能使用再它所在的区域
int a = 1;
a++;
System.out.println("这是一个方法里面的代码块 " + a);
}
//a++;
if (true) {
System.out.println("这是一个if的语句块");