Java运算符

1.算术运算符

+  正号、加号,连接字符串

  注意 “+” 遇到字符串,才变成字符串连接符,如"System.out.println(3+4+"3+4"+5+6);的结果是73+456

      任何类型只要和字符串+, 所有的数据都变成了字符串

public class Operator {
	public static void main(String[] args){
		boolean b = true;
		String s = "abc"+b;
		System.out.println(s);//输出 abctrue
	}	
}

  

-  减号,负数

* 乘号

/ 除号

  注意当除号两边为整数时,取整数部分,舍余数。当其中一边为浮点型时,按正常规则相除。

% 取余

  小数取余没有意义。结果符号与被取余符号相同。

 

对于除法运算和取模运算:

整数做被除数时,0不能做除数,否则报错。

小数做被除数时,整除0结果为Infinity,对0取模结果为NaN

 

++ 自增

--  自减

  i++与++i的区别

  我们常说i++先用后加,++i先加后用。  

  首先,单独的i++与++i,这个表达式独立计算的时候,没有任何区别,字节码是完全一样的。就是单纯把 i所在的局部变量表那个位置的值加1。

     但是变量如果参与了其他运算,就有区别了

    i++ 和 ++i 只有在最终赋值给某变量时(实际上是因为参与了运算,因为直接赋值也是一种无运算符号的运算),字节码指令是不同的,而且也只是顺序上的不同。

  区别是

  • i++:先将局部变量表中的 i 放入操作数栈中,再将局部变量表中的 i 值 +1
  • ++i:先局部变量表中的 i 值 +1,再将i放入操作数栈中

   参考:显微镜下的i++与++i

  

 

2.赋值运算符

=     +=    -=         *=         /=          %=

注意:诸如+=这样形式的赋值运算符,会将结果自动强转成等号左边的数据类型。

 

如下代码编译不会通过

byte b=1;
b = b+1;

因为b是byte类型,1是int类型,相加时b自动被提升成int类型,相加的结果应该是int类型。把int类型的值赋值给byte类型的值会报错。

 

而如下代码可以编译通过

byte b=1;
b += 1;

因为类似 += 这种运算符,会将结果自动强转成等号左边的数据类型。b+=1是一次运算,而b=b+1是两次运算(先计算b+1的值,再将b+1的值赋给b)

b += 1; 等价于 b = (byte)(b+1);

 

3.比较运算符

==  !=   >    <       >=      <=  

比较运算符两边的操作数的大小关系,结果为true或false

 

4.逻辑运算符

&   |     !     ^     &&         ||

 

逻辑运算符两边的操作数均为布尔值,如

System.out.println(1&true);

编译会报错“ 二元运算符 '&' 的操作数类型错误”

表达式的运算结果也是布尔值

 

&&(短路与)左边为false,则结果为false且右边不执行;||(短路或)左边为true,则结果为true且右边不执行

&&、||与&、|相比更有效率,所以我们一般采用&&、||。

 

5.三元运算符

格式:

 (条件表达式)?表达式1:表达式2;

  若条件表达式的值为true,则运算结果为表达式1,反之,为表达式2。 

 

运算符有优先级,赋值运算符优先级最低,不确定的优先级的时候加上小括号即可。

posted @ 2021-01-05 14:57  绮丽梦境  阅读(91)  评论(0编辑  收藏  举报