目录
1.算数运算符
1.1基本的四则运算(“+”、“-”、“ * ”、“/“、”%”)
1.2增量运算符 (“+=”、“-=”、“*=”、“%=”)
1.3自增/自减运算符 (“++”、“--”)
2关系运算符(“==”、“!=”、“<”、“>”、“<=”、“>=”)
3逻辑运算符(重点)(“&&”、“||” 、“!”)
3.1.1逻辑与 &&
3.1.2逻辑或 ||
3.1.3逻辑非!
4 位运算符(“&”、“|”、“~”、“^”)
4.1.1按位与" & "
4.1.2按位或" | "
4.1.3按位取反" ~ "
4.1.4异或" ^ "
5 移位运算(“<<”、“>>”、“>>>”)
5.1.1左移运算符<<
5.1.2右移运算符>>
5.1.3无符号右移运算符>>
6 条件运算符
运算符的优先级:
运算符的结合性:
技巧:如果记不清这些优先级的话,直接使用()去改变优先级。
什么是运算符?
就拿咋们常说的加号“+”,减号 “-”来说,他们就是运算符。“+”就是进行加法运算的符号,“-”就是进行减法运算的符号。运算符就是进行运算的符号。
运算符是干什么的?
那继续举例呗,“+”是干嘛的,就是进行数字相加的呗,“-”是干嘛的,就是进行数字相减的呗。那“>”是进行干嘛的,进行数字比较的呗。总结下来,运算符就是对操作数进行操作的。
算数运算符,关系运算符,逻辑运算符,位运算符,移位运算符,条件运算符...
1.1.1.这些都是二元运算符,所谓二元运算符,就是需要两个操作数才能进行操作。
1.1.2.使用过程中要注意自动类型转换。
1.1.3使用过程中的坑!:
“/”除法运算:int/int-->结果还是int类型,因为运算过程中没有double类型的数据,所 以 不会自动类型转化,并且还是向下取整。例如:5/2-->结果是2。同样的如果是double和int进行除法,那结果肯定会转为double类型。例如:5.0/2-->结果是2.5
“%”取余运算:(求模运算):取余运算是干什么的?当然是取余数的喽。
注意:1.java中浮点数、整数都可以取余数,而在c语言中只允许整数取余数!
2.无论是c语言还是java都不允许 分母为0的情况,也就是 1/0 或者1%0
int a = 1;
//给a加个2
a = a + 2;
//等价写法:
a += 2;
short a = 10;
a = a + 1;//会报错 常量1默认是int,无法将高精度值赋给低精度
a += 1; // 正确 系统会自动进行转变
1.后加加(指的是先使用该数字,使用完后加加)
int a = 1;
int b = a++;//先使用a,使用完后加加
System.out.println(b);//结果是1
2.后减减
int a = 1;
int b = a--;//先使用a,使用完后减1
System.out.println(b);//结果是1
3.先加加(先给该数字加1,然后使用)
int a = 1;
int b = ++a;//先给a加1,然后使用
System.out.println(b);//结果是2
4.先减减
int a = 1;
int b = --a;//先给a减1,然后使用
System.out.println(b);//结果是0
c和java的区别:c语言中关表达式的返回值可以用数字表示,0代表假,1代表真。
而在java中,不允许用数字表示,返回值只可能是true或者false。
举个例子
int a = 1;
int b = 2;
int c = 1;
//java中
System.out.println (a > b);//结果:false
System.out.println (a == c);//结果:true
//c语言中
printf("%d", a > b);//结果:0
printf("%d", a == b);//结果:1
注意:c和java的区别
int a = 10;
//c语言中
if (9 < a < 11)//该写法成立 9
表达式1 && 表达式2,当表达式1为false时,整个表达式就会返回flase,不会再去判断表达式2。
10/0-->会引起by Zero异常(分母不能为0)
/10>20为true,因此会执行第二个表达式10/0从而引发异常。
System.out.println(10 > 20 && 10 / 0 == 0);
//10<20为false,因此该语句就会结束并返回false,并不会去执行10/0,因此不会有异常。
System.out.println(10 < 20 && 10 / 0 == 0); // 打印 true
表达式1 && 表达式2,当表达式1为true时,整个表达式就会返回true,不会再去判断表达式2。
规则:只能用在boolean变量上
//正确用法
boolean flag = ture;
if(!flag)//只能用在boolean类型上
{
...
}
//错误写法(该写法在c语言中能通过 但是在java中不行)
while(!1)
{
...
}
两种用法:
方法1.将两个二进制数的每一位进行比较,如果两个相同位均为1,则返回1,否则其他为0;方法1举例:
int a = 5;
int b = 6;
System.out.println (a & b);//结果为4
//a变量的二进制为 0101
//b变量的二进制为 0110
//两者相与------&-------
//结果: 0100--->十进制为4
方法2:和逻辑与具有同样的功能, 当表达式为boolean返回类型时,表达式1 & 表达式2,当表达式1和表达式2都为true时,该结果返回true,否则返回false。
逻辑&&和按位&的区别:逻辑与在表达式1为假时,会直接结束语句,返回为flase。而按位与无论表达式1为真为假,都会将语句全部执行。
方法2举例:
//按位与-->即使表达式1为假,也会执行表达式2(表达式都执行) System.out.println(10 > 20 & 10 / 0 == 0);//结果:由于表达式2会报异常,无结果 //逻辑与-->表达式1为假,不会执行表达2 System.out.println(10 > 20 && 10 / 0 == 0);//结果:由于表达式1为假,结束语句。输出false。
两种用法:
方法1.将两个二进制数的每一位进行比较,如果两个相同位均为0,则返回0,否则其他为1;
方法1举例:
int a = 5;
int b = 6;
System.out.println (a | b);//结果为7
//a变量的二进制为 0101
//b变量的二进制为 0110
//两者相与------|-------
//结果: 0111--->十进制为7
方法2:和逻辑或具有同样的功能, 当表达式为boolean返回类型时,表达式1 | 表达式2,当表达式1和表达式2都为false时,该结果返回false,否则返回true。
逻辑&&和按位&的区别:逻辑或在表达式1为真时,会直接结束语句,返回为true。而按位与无论表达式1为真为假,都会将语句全部执行。
方法2举例:
//按位或
System.out.println(10 < 20 | 10 / 0 == 0);//结果:由于表达式2会报异常,无结果
//逻辑或
System.out.println(10 < 20 || 10 / 0 == 0);//结果:由于表达式1为真,结束语句。输出true。
小结:
1.逻辑与:只要表达式1为false,语句就结束,不会继续执行。
2.逻辑或:只要表达式1为ture,语句就结束,不会继续执行。
3.按位与:a.首先会有按位操作。b.也有逻辑与的功能,但是表达式1和2都必须全部执行。
4.按位或:a.首先会有按位操作。b.也有逻辑或的功能,但是表达式1和2都必须全部执行。
byte a = 5; // 补码:0000 0101
a = (byte)~a;//取反:1111 1010
System.out.println(a);//结果为-6
运算过程:1111 1010是补码---->转为原码:1000 0110 也就是-6
int a = 1;
int b = 0;
System.out.println(a^a);//最终结果为0
//a^a
//a:0000 0001
//a:0000 0001
//-^-----------
// 0000 0000
System.out.println(a^b);//最终结果为1
//a^b
//a:0000 0001
//a:0000 0000
//-^-----------
// 0000 0001
简单来说,就是将最左侧的(最高位)二进制位移除掉,给最右侧(最低位)二进制位补0。左移的效果就是给该数字乘2的n次方(n代表左移的位数)
举例说明:
byte a = 63;//二进制0011 1111
System.out.println(a<<1);//结果126
//将0011 1111左移一位:
//(最高位移除一位,最低位补0)--->0111 1110
简单来说,就是将最右侧的(最低位)二进制位移除掉,给最左侧(最高位)二进制位补0或1。
如何判断最高位补0补1:看符号位,符号位是1就补1,符号位是0就补0(符号位就是最高位,即最左位)。
简单来说,就是将最右侧的(最低位)二进制位移除掉,给最左侧(最高位)二进制位补0。
右移的效果就是给该数字除2的n次方(n代表右移的位数)
java和c的比较:
这个时候就想到了c语言,c语言在对“符号类型”(比如int,有正负的数字)右移,最左位也是根据符号位的变化,符号位是1就补1,符号位是0就补0。但是没有“无符号右移>>>”,并不代表c语言不能表示,c语言会使用 unsigned 来代表无符号类型,这样右移的时候最高位都是补0。
规则:表达式1 ? 表达式2 : 表达式3
来解释解释,如果表达式1为true,则会执行表达式2,否则执行表达式3.
int a = 10;
int b = 20;
//如果a
什么是运算符的优先级,举个大家都知道的例子,在数学中我们计算加减乘除的时候是不是先计算乘除后计算加减,这就说明乘除的优先级>加减的优先级。优先级就等于规定了计算的顺序。
结合性分为了左结合性和右结合性。
左结合性:左做到右进行运算。
右结合性:从右到左进行运算。
什么时候使用结合性?
当优先级相同的时候我们就需要使用结合性!那什么时候优先级相同呢?
举个简单的例子int a = 0; a = 5*3/4; //1.首先判断出来 *和/的优先级相同并且大于=的优先级 //2.*和/的优先级相同,那是先执行5*3还是先执行3/4呢? //3.此时,通过查看,*和/是左结合性,也就是先执行5*3之后再/4 //4.执行完后,只剩下=运算了。
3+5*3--->加括号后(3+5)*3.
但是呢,还是建议去多练一练记一记,如果人家的代码就是没有(),那你还不是得去读,所以掌握根本才是最好的!!!