Java运算符
Java运算符概述:
运算符是指明对操作数的运算方式。组成表达式的Java操作符有很多种(什么是操作数和操作符,例如1+2,其中1和2都是操作数,+是操作符,操作符和操作数联合起来构成表达式)。运算符按照其要求的操作数数目来分,可以有单目运算符(1个操作数)、双目运算符(2个操作数)和三目运算符(3个操作数)。运算符按其功能来分,有算术运算符、赋值运算符、关系运算符、逻辑运算符、位运算符、条件运算符、字符串连接运算符和其他运算符。常见的运算符如下表:
算术运算符 | +、-、*、/、%(取模)、++(自加1【单目】)、–(自减1【单目】) |
---|---|
关系运算符 | >、>=、<、<=、==、!= |
逻辑运算符 | &(逻辑与)、|(逻辑或)、!(逻辑非)、&&(短路与)、||(短路或) |
赋值运算符 | =、+=、-=、*=、/=、%=、^=、&=、|=、<<=、>>= |
位运算符 | &(按位与)、|(按位或)、^(按位异或)、~(按位取反【单目】)、<<(左移)、>>(带符号右移)、>>>(无符号右移) |
条件运算符 | 布尔表达式?表达式1:表达式2 (三目) |
字符串连接运算符 | + |
其它运算符 | instanceof、new |
运算符也是有优先级的,如果不确定优先级可以加小括号进行运算,添加小括号优先级是最高的。
1 算术运算符
public class NumTest {
public static void main(String[] args) {
int a = 10;
int b = 3;
System.out.println(a + b); //13
System.out.println(a - b); //7
System.out.println(a * b); //30
/*
* 在java语言中10除以3结果不是3.3333..
* 因为java中有一个语法规则:int类型和int类型
* 做运算,最终的结果还是int类型,所以10除以3
* 的结果就是3,这个过程会取整数位。
*/
System.out.println(a / b); //3
/*
* 10对3求余数,3乘3得9,余1。
*/
System.out.println(a % b); //1
}
运算结果:
public class NumTest{
public static void main(String[] args){
/*
* ++和--都是单目运算符,++负责自加1,--负责自减1
* 以下程序重点研究++运算符,--运算符可以依照++运算
* 符进行类推。
*/
int i = 10;
i++;
System.out.println("i = " + i); //11
int j = 10;
++j;
System.out.println("j = " + j); //11
/*
* 根据以上的程序可以得出结论:++可以出现在变量前,也
* 可以出现在变量后,无论是变量前还是变量后,只要执行完
* ++,最终的结果都会让变量自加1。那么++出现在变量前
* 和变量后到底有什么区别呢?请看以下程序
*/
int k = 10;
int m = k++;
/*
* 根据以上结论,++无论是出现在变量前还是变量后,只要++执行
* 变量一定会自加1,那么k变量一定会自加1,所以以下输出k=11
*/
System.out.println("k = " + k); //11
/*
* 以上int m = k++;代码中++和=两个运算符同时存在,
* 那么此时这两个运算符哪个优先级高呢?java语法中是这样
* 规定的,当++运算符出现在变量后,会先做赋值运算,再自
* 加1,所以最后m = 10
*/
System.out.println("m = " + m); //10
int x = 10;
int y = ++x;
//上行代码执行结束后,我们可以确定x变量一定自加1了,所以x=11
System.out.println("x = " + x); //11
/*
* java语法中又有这样的规定,++出现在变量前,会先进行自加1
* 的操作,然后再做赋值运算,所以y = 11
*/
System.out.println("y = " + y); //11
}
}
运算结果:
- 两个int类型数据进行数学运算之后的结果一定是int类型;
- ++或–可以出现在变量前也可以是变量后;
- ++无论出现在变量前还是变量后,只要执行了++,那么变量必然会自加1;
- ++出现在变量后会先进行赋值运算,再自加1;
- ++出现在变量前会先自加1,再进行赋值运算。
2 关系运算符
public class RelationTest {
public static void main(String[] args) {
int a = 10;
int b = 10;
System.out.println(a > b);//false
System.out.println(a >= b);//true
System.out.println(a < b);//false
System.out.println(a <= b);//true
System.out.println(a == b);//true
System.out.println(a != b);//false
//比较两个字符串是否相等,不能使用“==”,
//必须调用equals方法
System.out.println("abc".equals("abc")); //true
}
}
通过以上代码可以看出,任何一个关系运算符的运算结果都是布尔类型,最后的结果不是true就是false,没有其他值,并且我们也看到a变量和b变量在比较的时候是拿着变量当中保存的值进行比较。也就是说a == b实际上是拿着a变量中保存的10和b变量中保存的10进行比较,看它们是否相等
3 逻辑运算符
操作符 | 例子 | 结果 | 描述 |
---|---|---|---|
& | true&true | true | (5>3)&(5>4):5大于3并且5大于4 |
| | true|false | true | (5>3)|(5>10):5大于3或者5大于10 |
! | !false | true | false取反是true,true取反就是false |
^ | true^false | true | 异或运算符,只要两边的操作数不同,结果就是true |
&& | true&&true | true | 短路与(&&)和逻辑与(&)实际上最终的运行结果是完全相同的,只不过短路与(&&)会存在短路现象。 |
|| | true||false | true | 短路或(||)和逻辑或(|)实际上最终执行的运行结果完全相同,只不过短路或(||)会存在短路现象。 |
4 赋值运算符
public class Test {
public static void main(String[] args) {
//基本的赋值运算符
int i;
i = 10;
System.out.println("i = " + i);
i = 100;
System.out.println("i = " + i);
//扩展的赋值运算符
int x = 10;
x += 1; //等同于x = x + 1
System.out.println("x = " + x); //11
int y = 10;
y -= 1; //等同于y = y - 1
System.out.println("y = " + y); //9
int z = 10;
z *= 2; //等同于z = z * 2
System.out.println("z = " + z); //20
int m = 10;
m /= 3; //等同于m = m / 3
System.out.println("m = " + m); //3
int n = 10;
n %= 3; //等同于 n = n % 3
System.out.println("n = " + n); //1
}
}
x +=1和x = x+1又不完全相同:
public class Test {
public static void main(String[] args) {
byte x = 1;
// x=x+1; error:byte类型跟int类型混合运算结果为int类型,int类型的不能赋值给byte类型
x += 1; //相当于 x = (byte) (x + 1);
System.out.println(x);
}
}
5 条件运算符
public class Test {
public static void main(String[] args) {
boolean flag = true;
int k = flag ? 1 : 0; //flag为true所以选1
System.out.println("k = " + k); //1
int x = 100;
int y = 100;
System.out.println(x == y ? "x和y相等" : "x和y不相等"); //x == y为true 所以x和y相等
}
}
6 字符串连接运算符
public class StringTest {
public static void main(String[] args) {
int a = 10;
int b = 20;
int c = a + b; //加号两边都是int类型,执行求和运算
/*
* 以下代码虽然有两个加号,第一个加号在双引号当中,
* 不起任何作用,只是一个普通字符串,第二个加号由于
* 左边操作数是一个字符串,所以这个加号一定会进行
* 字符串连接,连接之后的结果还是一个字符串。
*/
System.out.println("a + b = " + c); //a + b = 30
//定义一个字符串类型变量
String name = "jack";
/*
* 字符串拼接在实际开发中很常用,拼接的时候是有口诀,大家记住,
* 将变量放到字符串当中进行拼接,可以这样做:1、在拼接的位置添加
* 一个英文双引号;2、在双引号中间添加两个加号;3、把字符串变量放到
* 两个加号中间。
*/
System.out.println("登录成功,欢迎" + name + "回来!");
}
}