第三章 运算符
运算符 - 上
表达式的概念
概念:程序是由许多语句组成的,语句的基本单位就是表达式,表达式由操作数和运算符组成。
x = 1 ;
y = x + 2 ;
z = ( x * 3 ) + ( y - 22 ) ;
运算符主要分为以下几类:
算术运算符、赋值运算符、关系运算符、逻辑运算符、位运算符
算术运算符
强调:字符串加上任何数据类型都是字符串连接。
public class OperatorDemo{
public static void main(String[] args){
int num1=100;
int num2=200;
int num3=num1+num2;
System.out.println(num3);
String s="我是字符串";//引用数据类型
System.out.println(s);
System.out.println(s+num1);
String s1="100";
System.out.println(s1+100);
//字符串加什么都是字符串
System.out.println(num2+s1+num1);
//自增 ++
// 如果++放后面,叫做后置自增,每次自增+1,是会先赋值,再自增。
int a=1;
int a1=a++;
System.out.println(a1); // 1
// ++可以放前面,会先自增,再赋值
int b=1;
int b1=++b;
System.out.println(b1); // 2
}
}
赋值运算符
通用的形式:变量名=表达式
- 复合赋值运算符
提示:还可以和位运算符构成复合赋值运算符,例如: ^=、<<=等。
public class OperatorDemo{
public static void main(String[] args){
int a2=1;
a2+=6; //a=a+6
System.out.println(a2);
short ss=1;
ss += 6; //在这里6默认为short型,s+=6; → s=s+6
// ss = ss+1;
// 有什么区别?这个会报错因为1为int型,ss为short型,ss+1为int型,
//赋值给ss,short型,精度高的转换给精度低的报错。
System.out.println(ss);
}
}
关系运算符
提示:关系运算符的返回结果是boolean类型的值。
public class OperatorDemo{
public static void main(String[] args){
// 关系运算符
int num5 = 1 ;
int num6 = 1 ;
System.out.println( num5 == num6 ); //true
System.out.println( num5 != num6 ); //false
}
}
运算符 - 下
逻辑运算符
public class OperatorDemo2{
public static void main(String[] args){
int num1=10;
int num2=11;
int num3=12;
boolean flag=flase;
// 与
System.out.println((num1>num2)&&(flag=num2<num3));
// &&短路与,条件1不成立,不判断条件2
System.out.println("&&短路与:"+flag);
System.out.println((num1>num2)&(flag=num2>num3));
// & 与,条件1不成立,判断条件2
System.out.println("&:"+flag);
// 或
System.out.println((num1>num2)||(flag=num2<num3));
// 短路或,条件1成立,不判断条件2
System.out.println(flag);
System.out.println((num1<num2)|(flag=num2<num3));
System.out.println(flag);
System.out.println(!(num1>num2));
}
}
位运算符
位运算符是对二进制的直接运算。
计算机作二进制运算用的是补码。
3 0000 0011
原码: 0000 0011 第一位是符号位,1表示负数,0表示正数。
反码: 0000 0011
(1) 正数的反码和原码一样;
(2) 负数的反码是保留符号位,其余的按位取反。
1000 0011(原码)→ 1111 1100(反码)
补码: 0000 0011
(1) 正数 的反码和原码和补码都一样
(2) 负数 的补码=负数反码+1
1000 0011(原码)→ 1111 1100(反码) → 1111 1101
public class OperatorDemo3{
public static void main(String[] args){
int num1=128;
int num2=129;
System.out.println("num1与num2:"+(num1&num2));//128
/*
0000 0000 1000 0000(补)
&0000 0000 1000 0001(补)
---------------------------
0000 0000 1000 0000(补)
*/
System.out.println("num1或num2:"+(num1|num2));//129
/*
0000 0000 1000 0000(补)
|0000 0000 1000 0001(补)
---------------------------
0000 0000 1000 0001(补)
*/
System.out.println("非num1:"+(~num1));//-129
/*
0000 0000 1000 0000(补)
1111 1111 0111 1111(补)
---------------------------
1000 0000 1000 0001(原码)
*/
System.out.println(2<<3);
//2向左移动三个单位 *2^3 16
System.out.println(16>>3);
//2向右移动三个单位 /2^3 2
System.out.println(-16>>>3);
//无符号移动,无论正负,高位均补0 536870910
System.out.println(-16>>3);
//2向右移动三个单位 /2^3 -2
}
}
运算符优先级
提示:当搞不清楚运算符之间优先级的时候,自己多添加小括号不妨是一个很好的解决方案。