本文测试了 算术运算符: + - * / % += -= *= /= %= ;逻辑运算符: && || ! & | ;关系运算符:< > == <= >= != ;位运算符: & | ~ ^ >> << ;其他运算符:++ -- = instanceof 。对这些运算符的特点、优先级、注意事项都有说明。
一、算术运算符
package com.wllfengshu.test;
import org.junit.Test;
/**
* 测试运算符: + - * / %
* += -= *= /= %=
* 1、运算符作用
* 2、优先级测试
* 3、自增与自减
* 4、注意事项
* @author Administrator
*
*补充:java中的方法名、变量名的最大长度可以为2的16次方个字符,换算后也就是64KB的大小
也就是说最大可以为64KB,超过这个长度后java文件就无法被编译了
但一般是见名知意,不超过20个字符
*/
public class Test1算数运算符 {
//+
@Test
public void testAdd() {
int a=1;
a+=2;
System.out.println(Integer.MAX_VALUE);//2147483647
int b=Integer.MAX_VALUE+a;
System.out.println(b);//溢出:-2147483646
int c=Integer.MAX_VALUE+1;
System.out.println(c);//溢出:-2147483648
int d=2147483647;//int存储的最大值
// int e=2147483648;//报错:此时编译器已经判断数据过大
int f=2147483647+1;//此时数据随已溢出,但是只有当程序运行期间才能发现错误
System.out.println(Integer.MAX_VALUE + Integer.MIN_VALUE);//-1,把0归为整数里,负的更多
int g;
int h;
// int i=g+h;//变量需要初始化
//结论:直接用数字赋值,编译器直接判断数据是否过大(或过小);运算式的最后结果是否溢出,只有当程序运行期间才能发现
}
//-
@Test
public void testSubtract() {
int a=1;
a-=2;
System.out.println(Integer.MAX_VALUE);//2147483647
int b=Integer.MAX_VALUE+a;
System.out.println(b);//溢出:-2147483646
int c=Integer.MAX_VALUE+1;
System.out.println(c);//溢出:-2147483648
int d=2147483647;//int存储的最大值
// int e=2147483648;//报错:此时编译器已经判断数据过大
int f=2147483647+1;//此时数据随已溢出,但是只有当程序运行期间才能发现错误
System.out.println(Integer.MAX_VALUE + Integer.MIN_VALUE);//-1,把0归为整数里,负的更多
//结论:直接用数字赋值,编译器直接判断数据是否过大(或过小);运算式的最后结果是否溢出,只有当程序运行期间才能发现
}
//*
@Test
public void testMultip() {
int a=1;
a*=2;
a=a+3*4;//乘法优先级高于加法
double b=2.1;
double c=5;
c*=b;
System.out.println(c);
int e = 0;
e*=2+3;//【报错】必须初始化变量e:等价于:e=e*(2+3);
//结论:乘法优先级高于加法和减法
}
// /
@Test
public void testDivision() {
int a=1;
a/=2;
// a/=0;//[算术异常]:程序运行时报错
//结论:被除数不能为0
}
// %
@Test
public void testMod() {
int a=2;
int b=3;
int c=b%a;//根据
System.out.println(c);
int aa=-2;
int bb=5;
System.out.println(aa%bb);//取模支持对负数进行运算,且结果的符号总是与被除数的符号保持一致
double d=2.2;
double e=4.4;
double f=e%d;
System.out.println(f);
double g=4.5%2.2;
double h=4.5/2.2;
System.out.println(g);//0.09999999999999964 并不是0.1
System.out.println(h);
//结论:小数也可以求模运算,但是存在误差,并不建议对小数求模
}
}
二、关系运算符
package com.wllfengshu.test;
import org.junit.Test;
/**
* 测试关系运算符:< > == <= >= !=
* @author Administrator
*/
public class Test2关系运算符 {
@Test
public void testRelation() {
int a = 1;
int b = 2;
System.out.println("a == b = " + (a == b));
System.out.println("a != b = " + (a != b));
System.out.println("a > b = " + (a > b));
System.out.println("a < b = " + (a < b));
System.out.println("b >= a = " + (b >= a));
System.out.println("b <= a = " + (b <= a));
// 关系运算符优先级低于算术运算符
}
}
三、逻辑运算符
package com.wllfengshu.test;
import org.junit.Test;
/**
* 测试逻辑运算符: && || ! & |
* 1、运算符作用
* 2、优先级测试
* 3、注意事项
* @author Administrator
*
*/
public class Test3逻辑运算符 {
// &&
@Test
public void test1(){
int a=1;
int b=2;
if (a==b && (a++)==b) {
System.out.println("a等于"+a);
}else {
System.out.println("a等于"+a);//1
}
//总结:短路“与”,当第一个条件不成立,不再执行后面的条件
}
// ||
@Test
public void test2(){
int a=2;
int b=2;
if (a==b || (a++)==b) {
System.out.println("a等于"+a);//2
}else {
System.out.println("a等于"+a);
}
//短路“或”,当第一个条件成立,不再执行后面的条件
int c=3,d=4,e=5;
if (a<(++c) || a>(++d) && a<(++e)) {
System.out.println(c);//4
System.out.println(d);//4
System.out.println(e);//5
//程序只执行了a<(++c),前为真,后面不再执行
}
}
// !
@Test
public void test3(){
boolean a=true;
boolean b=false;
if (!a==b) {
System.out.println("条件成立");
}
//总结:非的优先级高于其他逻辑运算符
}
// &
@Test
public void test5(){
int a=1;
int b=2;
if (a==b & (a++)==b) {
System.out.println("a等于"+a);
}else {
System.out.println("a等于"+a);//2
}
//总结:不是短路“与”,当第一个条件不成立,继续执行后面的条件
}
// |
@Test
public void test6(){
int a=2;
int b=2;
if (a==b | (a++)==b) {
System.out.println("a等于"+a);//3
}else {
System.out.println("a等于"+a);
}
//不是短路“或”,当第一个条件成立,继续执行后面的条件
}
}
四、位运算符
package com.wllfengshu.test;
import org.junit.Test;
/**
* 测试运算符: & | ~ ^ >> <<
* @author Administrator
*
*/
public class Test6位运算符 {
//&
@Test
public void test1(){
int a=3;//转二进制:0011
int b=a & 1;//把1转二进制:0001
System.out.println(b);//结果为0001 所有为1
//总结:对应地数位都为1,才为1,其余都为0
}
//|
@Test
public void test2(){
int a=3;//转二进制:0011
int b=a | 1;//把1转二进制:0001
System.out.println(b);//结果为0011 所有为3
//总结:对应地数位都为0,才为0,其余都为1
}
//~ 非
@Test
public void test3(){
int a=3;//转二进制:0000...00000011
int b=~a;
System.out.println(b);
System.out.println(Integer.toBinaryString(b));//结果为11111111 11111111 11111111 11111100 所有为-4
//总结:a对应的位为1,则b对应地位为0;否则为1
}
//^ 异或
@Test
public void test4(){
int a=3;//转二进制: 0000...00000011
int b=4;//把1转二进制:0000...00000100
System.out.println(b^a);//结果为 0111 所有为7
//总结:a与b对应位相同,则结果对应位为0;否则为1
}
//>>
@Test
public void test5(){
int a=3;//转二进制: 0000...00000011
int b=a>>1;
System.out.println(b);//结果为 0000...00000001 所以为1
//总结:右移运算符, a >> 1,a二进制减少一位,相当于num除以2
}
//<<
@Test
public void test6(){
int a=3;//转二进制: 0000...00000011
int b=a<<1;
System.out.println(b);//结果为 0110 所有为6
//总结:左移运算符,a << 1,a 二进制增加一位,相当于num乘以2
}
}
五、其他运算符
package com.wllfengshu.test;
import org.junit.Test;
/**
* 测试其他运算符:++ -- = instanceof
* @author Administrator
*
*/
public class Test5其他运算符 {
//++ 自增
@Test
public void test1(){
int a=1;
int b=1;
System.out.println(a++);//1
System.out.println(++b);//2
//++在前,表示在使用变量a之前加一;++在后,表示在使用变量a之后加一
}
//-- 自减
@Test
public void test2(){
int a=1;
int b=1;
if(a--==0){
System.out.println("条件成立");
}else{
System.out.println("条件不成立");
}
//--在后,表示在使用变量a之后减一
}
// =
@Test
public void test3(){
int a=2;
int b=1;
b=a;
System.out.println(b);
//赋值运算符优先级最低
}
// instanceof
@Test
public void test4(){
A a=new A();
B b=new B();
C c=new C();
boolean d=a instanceof A;//对象a是否是A类的实例
boolean e=a instanceof C;//对象a是否是A类的子类C的实例
boolean f=c instanceof A;//对象c是否是C类的子类C的实例
System.out.println(d);//true
System.out.println(e);//false
System.out.println(f);//true
//通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。
}
class A{
}
class B{
}
class C extends A{
}
}
【有些地方考虑不周或者错误的地方,欢迎大家指正】