运算符的优先级,实际上是在一个计算式中,存在多个运算符计算,先算谁,后算谁的问题。
在数学中,上小学时,常常听到老师说:"先乘除,后加减",这是基本原则,但在复杂的运算中,我们还得注意括号等等。
以下列出java运算符优先级别。
赋值是用等号运算符(=)进行的。它的意思是“取得右边的值,把它复制到左边”。
右边的值可以是任何常数、变量或者表达式,只要能产生一个值就行。但左边的值必须是一个明确的、
已命名的变量。也就是说,它必须有一个物理性的空间来保存右边的值。
举个例子来说,可将一个常数赋给一个变量(A=4;),但不可将任何东西赋给一个常数(比如不能)
Java的基本算术运算符与其他大多数程序设计语言是相同的。整数除法会直接砍掉小数,而不是进位。
Java也用一种简写形式进行运算,并同时进行赋值操作。这是由等号前的一个运算符标记的,
而且对于语言中的所有运算符都是固定的。例如,为了将4加到变量x,并将结果赋给x,可用:x+=4。
递减运算符是“--”,意为“减少一个单位”;递增运算符是“++”,意为“增加一个单位”。举个例子来说,
假设A是一个int(整数)值,则表达式++A就等价于(A= A + 1)。递增和递减运算符结果生成的是变量的值。
对每种类型的运算符,都有两个版本可供选用;通常将其称为“前缀版”和“后缀版”。“前递增”表示++运算符位于变量
或表达式的前面;而“后递增”表示++运算符位于变量或表达式的后面。
类似地,“前递减”意味着--运算符位于变量或表达式的前面;而“后递减”意味着--运算符位于变量或表达式的后面。
对于前递增和前递减(如++A或--A),会先执行运算,再生成值。而对于后递增和后递减(如A++或A--)会先生成值,
再执行运算。
eg:
package com.lanhuigu.java.compute;
/**
* 递增(++)和递减(--)
*/
public class AutoTest {
public static void main(String[] args) {
// 1.递增
// 1.1 先++(双加号在前)
int preAdd = 1;
//执行逻辑:preAdd先加1变成2,得到的结果preAdd为2赋值给表达式++preAdd,即preAddNum为2
int preAddNum = ++preAdd;
System.out.println("preAdd:" + preAdd);
System.out.println("preAddNum:" + preAddNum);
// 1.2 后++(双加号在后)
int aftAdd = 1;
//执行逻辑:先把aftAdd的值1赋值给表达式aftAdd++,即aftAddNum为1,再把aftAdd加1变成2
int aftAddNum = aftAdd++;
System.out.println("aftAdd:" + preAdd);
System.out.println("aftAddNum:" + aftAddNum);
//2.递减
//2.1 先--(双减号在前)
int preSubtract = 1;
//执行逻辑:preSubtract先减1变成0,得到的结果preSubtract为0赋值给表达式--preSubtract,即preSubtractNum为0
int preSubtractNum = --preSubtract;
System.out.println("preSubtract:" + preSubtract);
System.out.println("preSubtractNum:" + preSubtractNum);
//2.2 后--(双减号在后)
int aftSubtract = 1;
//执行逻辑:先把aftSubtract的值1赋值给表达式aftSubtract--,即aftSubtractNum为1,再把aftSubtract减1变成0
int aftSubtractNum = aftSubtract--;
System.out.println("aftSubtract:" + preSubtract);
System.out.println("aftSubtractNum:" + aftSubtractNum);
}
}
控制台输出结果:
preAdd:2
preAddNum:2
aftAdd:2
aftAddNum:1
preSubtract:0
preSubtractNum:0
aftSubtract:0
aftSubtractNum:1
关系运算符生成的是一个“布尔”(Boolean)结果。它们评价的是运算对象值之间的关系。若关系是真实的,
关系表达式会生成true(真);若关系不真实,则生成false(假)。关系运算符包括小于(<)、大于(>)、
小于或等于(<=)、大于或等于(>=)、等于(==)以及不等于(!=)。等于和不等于适用于所有内建的数据类型,
但其他比较不适用于boolean类型。
注意==和equals()的区别:
package com.lanhuigu.java.compute;
/**
* ==和equals()的区别:
* (1)==相同对象的相同内容时为true,否则为false
* (2)相同或不同对象的相同内容为true,否则为false
*/
public class EqualsTest {
public static void main(String[] args) {
// 创建两个不同对象t1、t2,但是内容相同均为1
Integer t1 = new Integer(1);
Integer t2 = new Integer(1);
// Test
System.out.println(t1 == t2);// false
System.out.println(t1.equals(t2));// true
}
}
逻辑运算符AND(&&)、OR(||)以及NOT(!)能生成一个布尔值(true或false)——以自变量的逻辑关系为基础。
&&: 全真才真,一假必假
||: 一真即真,全假才假
!: 真假相对
移位运算符面向的运算对象也是二进制的“位”。可单独用它们处理整数类型(主类型的一种)。
左移位运算符(<<)能将运算符左边的运算对象向左移动运算符右侧指定的位数(在低位补0)。
“有符号”右移位运算符(>>)则将运算符左边的运算对象向右移动运算符右侧指定的位数。
“有符号”右移位运算符使用了“符号扩展”:若值为正,则在高位插入0;
若值为负,则在高位插入。Java也添加了一种“无符号”右移位运算符(>>>),它使用了“零扩展”:无论正负,都在高位插入0。
这一运算符是C或C++没有的。若对char,byte或者short进行移位处理,那么在移位进行之前,它们会自动转换成一个int。
只有右侧的5个低位才会用到。这样可防止我们在一个int数里移动不切实际的位数。若对一个long值进行处理,
最后得到的结果也是long。此时只会用到右侧的6个低位,防止移动超过long值里现成的位数。但在进行“无符号”右移位时,
也可能遇到一个问题。若对byte或short值进行右移位运算,得到的可能不是正确的结果(ava 1.0和ava 1.1特别突出)。
它们会自动转换成int类型,并进行右移位。但“零扩展”不会发生,所以在那些情况下会得到-1的结果。
布尔表达式?值0:值1;
如果布尔表达式为true,整个表达式的值为值0,否则,整个表达式的值为值1;
package com.lanhuigu.java.compute;
/**
* 布尔表达式?值0:值1;
*/
public class ThreePhase {
public static void main(String[] args) {
String testStr = 2 > 1 ? "值0" : "值1";
System.out.println(testStr);
}
}
连接不同的字符串,实际工作中用StringBuffer或StringBuilder替代"+"号连接字符串。
package com.lanhuigu.java.compute;
/**
* +连接不同的字符串
*/
public class MyPlusSign {
public static void main(String[] args) {
//1、从左边开始算起,1+1为2,当遇到字符串时,自动转换成字符串连接
System.out.println(1 + 1 + "this is my test" + 1 + 1 + "!");
//2、从左边开始,右边遇到左边的字符串自动转换成字符串连接
System.out.println("this is my test" + 1 + 1 + 1 + "!");
}
}
控制台输出:
2this is my test11!
this is my test111!