目录
算数运算符
算术运算符包含以下几种:+,-, * ,/,%,++,--
'+'运算不止可以进行数值与数值之间的运算,还可以进行数值与char类型之间的运算。
在这里我详细谈一下 ++(自增)
"++"分为'左++'跟'右++'
左++是先运算后取值
右++是先运算后取值
//1
public static void main (String args[]) {
int num=0;
for (int i=0;i<100;i++) {
num=++num;
}
System.out.println("num="+num);
}
}
//2
public static void main (String args[]) {
int num=0;
for (int i=0;i<100;i++) {
num=num++;
}
System.out.println("num="+num);
}
}
大家可以猜一下这两道题的答案分别是多少
(可能有的小伙伴没有看出来这两道题的区别)
区别在这里:
怎么样,知道正确答案了吗
接下来谢晓答案:
为什么会造成这样的结果呢
这里我们必须先明确一个事实,那就是第一个num跟第二个num在底层运算里不在同一个位置
就叫它们num_1跟num_2吧
第一题
num=++num;
num_2先自增,然后赋值给num_1,所以,num_1的值会越来越大。
第二题
num=num++;
num_2先赋值给了num_1,然后num_2自增,这里num_2自增之后的值并没有赋给num_1,而在下一次循环中被覆盖。
(P.S:实际开发过程中一般不用++,而是+=,这种更容易理解)
连接运算符
连接运算符主要用于连接字符串,其运算符为:+;
+字符连接两个字符串,要求‘+’两端的类型必须一致,当 ‘+’ 运算的时候,两边的操作数都是数字的话,一定会进行求和运算,只要其中有一个操作数是字符串类型,那么一定会进行字符串拼接运算,字符串拼接之后的结果还是字符串类型。
public static void main(String[] args) {
int a=10,b=100;
String c = "abc";
System.out.println(a+b);//110
System.out.println(a+c+b);//10abc110
}
关系运算符
关系运算符主要为:==,!=,<,>,<=,>=
其中"<",">","<=",">="只能比较两个变量的大小,而"=="与"!=",不仅可以比大小,还可以进行引用类型的比较。
public static void main(String[] args) {
int a=10,b=100;
int a1=10;
String c = "abc";
String d = "abc";
System.out.println(a>b);//false
System.out.println(a<=b);//true
System.out.println(a!=a1);//false
System.out.println(a==b);//false
//字符串之间的比较
System.out.println(c==d);//true
}
注意:比较运算符"==",切忌写成"="。
public static void main(String[] args) {
boolean winner = false;
if(winner==true){
System.out.println("日本");//这里==是比较符,winner!=true,
//所以不输出
}
if(winner=true){
System.out.println("中国");//这里=是赋值符,将true赋值给了winner,
//所以输出的结果为中国
}
}
逻辑运算符
逻辑运算符主要包含:& (与) |(或) !(非) &&(短路与) ||(短路非)
所有逻辑运算符的操作数都是布尔型,它的结果也都是布尔型。
细心的小伙伴可能已经发现&跟&&( | 跟 || )的结果是一样的,那既然结果是相同的,为什么Java还要把两个分开呢,这就要谈到&(与)跟&&(短路与)的区别了:
虽然二者都是只要有一个为false,其结果就为false,但是
&时,左边无论真假,右边都进行运算;
&&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算;
( | 跟 || 同理)
public static void main(String[] args) {
boolean state=false;
int i=2;
if((++i>2)&&(state=true)){ //i==3,true赋值给state
i++; //i==4
}
if((++i>4)||(state=false)){ //i==5,||短路或,true||(state=false),后面短路,不进行。
i++;
}
System.out .println (i);//i==6
System.out .println (state);//state==true
}
赋值运算符
赋值运算符主要包括 (基本赋值运算符) =,(扩展赋值运算符)+=,-=,*=,/=,%=
"=" 左边的操作数必须是变量,不能是常量或表达式。
当"="两边数据类型不一致时,可使用自动类型转换或强制类型转换进行处理
切记不要把"="跟 "=="混淆
下面我们让来进行一个思考:
public static void main(String[] args) {
short a=2;
a=a+2;//①
a+=2; //②
}
这里的①跟②有没有区别,如果有区别是什么
(答案当时是有了,不然我问这个问题干嘛)
区别:a=a+2,a是short类型,如果直接进行a+2操作的话,会进行自动转换,将short转换为int
( 详解可参考我的上一篇博客:JavaSE基础语法---基本数据类型转换)
而a+=2就不存在这个问题,虽然它的等效表达式也是a=a+2但是它不会进行隐式转换,
所以它的数据类型依旧是short。这也是为什么实际开发过程中"+="比"++"与"a=a+2"使用更频繁的原因。
条件运算符
条件运算符是三目运算符,它的表达式为:<表达式1> ? <表达式2> :<表达式3> ;
表达式1的返回类型是Boolean型,如果结果为true则返回表达式2,结果为false返回表达式3.
位运算
程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中的二进制位进行操作,这样可以是计算机更快的运转。
在这里我们就不细谈了,以后有机会再详细讲讲
表达式的运算顺序