在前面我们学习了数据类型和变量。那么,我们怎么使用变量进行计算呢?要用变量进行计算,我们首先需要明白什么是运算符,有哪几种运算符?运算符对操作数进行操作时的符号,不同操作符操作含义不同。当运算符对变量进项操作时,变量也可成为操作数。
在java中,运算符有算数运算符(+、-、*、/)、关系运算符(<、>、==)、逻辑运算符、位运算符以及条件运算符。
在java中的加减乘除也跟c差不多的,这里举例一个加法例子,然后减法和乘法类似。我主要是把需要注意的点单独详细讲。
public class test {
public static void main(String[] args) {
int a=10;
int b=20;
System.out.println(a+b);
}
}
运行结果:
被除数不能为零
,先来看看正常输出结果,然后看异常会是怎么样的。
public class test {
public static void main(String[] args) {
int a=10;
int b=2;
System.out.println(a/b);
}
}
运行结果:
被除数为0的情况,编译器会报错
取模的另一种表达就是取余数。这里讲一个很有意思的例子,相信很多小伙伴多多少少都在这里栽过跟头。
public class test {
public static void main(String[] args) {
System.out.println(10%3);
System.out.println((-10%3));
System.out.println((10%-3));
System.out.println((-10%-3));
}
}
运行结果:
你做对了么?做对了那就恭喜你。如果做错了那也没关系,先来思考一下,这是为什么呢?它是怎么计算的呢?这是因为:
在C语言中%两边操作数不能是浮点型的,但是在java中,这是可以被允许的。
在下面的代码中,编译器帮你进行了隐式类型转换(int–>double)。这里有个规律,就是当小的类型跟大的类型进行运算时,编译器会帮你进行隐式转换(小转大)。
public class test {
public static void main(String[] args) {
double a=12.3;
int b=5;
System.out.println(a%b);
}
}
运行结果:
+=、-=、*=、%=
也叫增量运算符,用法跟C语言的差不多。int a=10;int b=10;a+=b;就是a=a+b;
但是在java中a+=b和a=a+b还是有一点点区别的。
先来看看(a+=b):
public class test {
public static void main(String[] args) {
short a=10;
a+=2;
System.out.println(a);
}
}
运行结果(a+=b):
第二种(a=a+b)运行结果:
这里他会直接给你报错的,原因是2是int类型,前面我们说过。所以这里的2+a被转换成了int类型,当你int类型赋值给short的时候,编译器就会报错。想不报错的话你可以进行强转,但是要承担数据丢失的风险,但是要注意强转也是要在目标是话剧类型范围之内,不然数据就会得到一个毫不相干的值。(这里不在赘述,上一节将数据类型的时候有讲过)但是为什么a+=b编译器就不报错呢,这两者不是一样的吗?原因就在于+=是编译器帮你进行了int-->shot转换。这就是在Java中a+=b和a=a+b的一点小区别。
++、--
运算符,还分为前置++和后置++、前置–和后置–。至于是前置还是后置,在一条语句中结果都是一样的,真正的区别就是在表达式中。这里就举着两个例子让你体会一下。
在语句中:
public class test {
public static void main(String[] args) {
int a=10;
int b=20;
a++;
++b;
System.out.println(a);
System.out.println(b);
}
}
运行结果:
在表达式中:
public class test {
public static void main(String[] args) {
int a = 10;
int b = 20;
int c = a++;//这里是先把a的值个c在++啊(后置++)
int d = ++b;//这里是先++b在赋值给d(后置++)
System.out.println(c);
System.out.println(d);
System.out.println(a);
System.out.println(b);
}
}
运行结果:
这里需要注意的就是关系运算符的结果只有true和false,不同于c语言的是,0是假,非零就是真。
而且很多人容易犯错的就是在java中两个等号(==)才是等于,一个等号(=)表示的是赋值。
逻辑运算符无非就三个(&&,||,!)。
逻辑运算符的结果是boolean类型
,就是只有true的false两种取值。这里将几个需要注意的点。
&&逻辑与跟c用法差不多,一假就假。这里提一下一个需要注意的点。
就是当逻辑与前一个操作数为假时,后一个操作数就会被短路掉。也就是说,只要前一个操作数为假,编译器就不会检验后一个操作数,而是直接出结果为假。(只有前一个操作数为真时编译器才会检验后一个操作数的真假)
下面来给你举一个例子。总所周知除号分母是不能够为0的,但是这里编译器却没有报错,原因是编译器自动忽略掉了这一段代码。如果你把分母为0表达式直接拎出来,并且表达式完整,编译器就会给你报分母不能为0的错误了。
public class test {
public static void main(String[] args) {
int a=10;
int b=20;
System.out.println(a>20&&(b/0)==1);
}
}
运行结果:
如果把上图输出逻辑与的表达式1和表达式2交换,编译器就会给你报这样的错误:
总结规律:
逻辑或也叫短路或,顾名思义就知道肯定和短路与有着相同的性质。这里也列出跟逻辑与一样的例子来验证一下。这里需要注意的是,逻辑或前面的操作数是有真为真。
当逻辑非前面的操作数为真时,编译器也不会检验逻辑或后面的操作数的真假。
public class test {
public static void main(String[] args) {
int a=10;
int b=20;
System.out.println(a==10||(b/0)==1);
}
}
运行结果:
如果把上图输出逻辑或的表达式1和表达式2交换,编译器就会给你报同样的错误:
总结规律:
逻辑非就是一个!号,就表示逻辑非。规律是:非真即假,非假即真。
要说&&和&,||和|的区别就在短路上,就是说&&和||支持短路,然后&和|不支持短路。(&叫按位与,|叫按位或,&和|会在下面介绍)
位运算符主要有四个
(&,|,^,~)
,除了~
是一元运算符之外,其他都是二元运算符。
按位与(&):如果两个二进制位为1则结果为1 ,否则为0
按位或(|):如果两个二进制位为0,则结果为0,否则为1
异或(^):两个二进制位相同结果为0,否则结果为1
取反(~):二进制位为1就转0,为0就转1
这里讲解一个按位异或,其他运算方式也类似的
移位运算符有三个,都是二元运算符。移位运算是按照二进制比特位来计算的。在java中增加了>>>(无符号右移),表示最右侧不要了,最左侧补0。
左移(<<):最左侧位不要了,最右侧位补0
右移(>>):最右侧位不要了,最左侧位补符号位(正数0,负数1)
无符号右移(>>>):最右侧位不要了,最左侧位补0
在java中条件运算符只有一个,也与C语言中的用法类似。我们也可以用条件运算符把别的类型变成boolean类型输出,不过很少用。如果是int–>boolean用条件运算符可以写成
a>10?true:false
;
当表达式成立时,会输出表达式2的结果;当表达式1不成立时,会输出表达式3的结果。
public class test {
public static void main(String[] args) {
int a=10;
int b=20;
boolean c=a>10?true:false;
System.out.println(c);
}
}
运行结果:
总结规律:
如果不使用圆括号,就会按照运算符的优先次序进行排序
。下图给出运算符的优先级和结合性:
运算符的优先级和结合性总结流程图(从上到下优先级依次降低):
只有枯燥的学习才能收获极致的熟练,只有机械的重复才有资格拥抱唯美的创造