运算符


Java 语言支持如下运算符:

  • 算术运算符 +,-,*,/,%,++,--
  • 赋值运算符 =
  • 关系运算符 >,<,>=,<=,==,!= instanceof
  • 逻辑运算符 &&,||,!
  • 位运算符 &,|,^,~ , >>,<<,>>> (了解!!!)
  • 条件运算符 ?:
  • 扩展赋值运算符 +=,-=,*=,/=

1.二元运算

两个操作数

public static void main(String[] args) {
    int a = 10;
    int b = 20;
    int c = 25;
    int d = 25;
    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) );
}

整数运算

如果两个或多个操作数中有一个为Long, 则结果也是Long

没有long时,结果为int。即使操作数全为shot,byte,结果也是int.

public static void main(String[] args) {
    long a = 1231321311231231L;
    int b = 1213;
    short c = 10;
    byte d = 8;

    System.out.println(a + b + c + d); //Long类型
    System.out.println(b + c + d);//Int类型
    System.out.println(c + d);//Int类型
}

浮点运算

如果两个或多个操作数有一个为double, 则结果为double

只有表达表操作数都是float, 则结果才为float

public static void main(String[] args) {
    float a = 3.14565F;
    double b = 3.194546464;
    float c = 1.3123123F;
    System.out.println(a+b); //double类型
    System.out.println(b+c); //double类型
    System.out.println(a+c); //float类型
}

关系运算符

运算符 描述 例子
== 检查两个操作数的值是否相等,如果相等则为真 (4 == 5)为假
!= 检查两个操作数的值是否相等,如果不相等则为真 (5 != 5)为假
> 检查左操作数的值是否大于右操作数的值,如果大于则为真 (5 > 4)为真
< 检查左操作数的值是否小于右操作数的值,如果小于则为真 (5 < 4)为假
>= 检查左操作数的值是否大于或等于右操作数的值,如果大于或等于则为真 (5 >= 5)为真
<= 检查左操作数的值是否小于或等于右操作数的值,如果小于或等于则为真 (5 =< 4)为假

2.取模运算

在计算机中,除法分两种,对整数做除法运算以及对浮点数做除法运算;除法运算符号也分两种,/ 是对两被除数取整,% 是对被除数取余

5%3 余 2

5/3 得1

  • 浮点数做除法运算

    double num_dou1 = 7.0;
    double num_dou2 = 2;
    System.out.println("dou = " + num_dou1 / num_dou2);//dou = 3.5
    System.out.println("dou = " + num_dou1 % num_dou2);//dou = 1.0
    
  • 整数做除法运算

    int num_int1 = 5;
    int num_int2 = 2;
    System.out.println("int1 = " + num_int1 / num_int2);//int1 = 2
    System.out.println("int2 = " + num_int1 % num_int2);//int1 = 1
    
  • 浮点数与整数做除法运算

    int num_int2 = 2;
    double num_dou1 = 7.0;
    System.out.println("int&dou1 = " + num_dou1 / num_int2);//int&dou1 = 3.5
    System.out.println("int&dou2 = " + num_dou1 % num_int2);//int&dou2 = 1.0
    

由上可以得出浮点数与浮点数或整数做取整反回的是带小数的,而整数对整数取整反回的还是整数,如果不想丢失精度,那在做取整时,把整数转浮点数再求值

负数%负数=负数;

负数%正数=负数;

正数%负数=正数;

3.一元运算符

自增(++)自减(--)运算符是一种特殊的算术运算符,在算术运算符中需要两个操作数来进行运算, 而自增自减运算符是一个操作数,分为前缀和后缀两种。

int a = 5;
int b = a++;//后置的++是先给b赋值,然后再自增
System.out.println(b);//5,因为b是在a自增前赋值的
int c = ++b;//前置的++是先自增,然后再给c赋值
System.out.println(a);//6,因为在赋值给b后自增了1
System.out.println(b);//6,因为在赋值给c前自增了1
System.out.println(c);//6,因为b是在a自增前赋值的,而c是在b自增后赋值的

幂运算

在数字运算中,2^3 = 2*2*2 = 8,但在java中 ^ 是异或符号

double pow = Math.pow(2,3);
System.out.println(pow);//8.0
//在java中有一些工具类可以用来做数字运算

4.逻辑运算符

逻辑与:&&和&

逻辑或:||和|

逻辑非:!

运算符 描述 例子
&& 当且仅当两个操作数都为真,条件才为真 (true && false) 为假
|| 当且仅当两个操作数任一为真,条件为真 (true && false) 为真
! 如果条作为true则条件为假,反之为真 (!true) 为假

例子的true和false可以为表达式,但表达式的结果必须是boolean布尔值。

逻辑与逻辑或 采用短路的方式。逻辑与只要有一个为false, 则直接返回false;逻辑或只要有一个为true, 则直接返回true

从左到右计算,如果确定值则不会再计算下去。在两个操作数都为 true时,结果才为true,但是当得到第一个操作为false时,其结果就必定是false,这时候就不会再判断 第二个操作了。

int a = 5;
boolean flag = (a < 4) && (a++ < 10);
System.out.println(flag);//false
System.out.println(a);//5
//首先判断 a<4 的结果为 false,则 b 的结果必定是 false, 所以不再执行第二个操作 a++<10 的判断
flag = (a == 5) || (--a > 4);
System.out.println(flag);//true
System.out.println(a);//5
//首先判断 a == 5 的结果为 true,则不管 b 的结果是啥,不再执行第二个操作 --a < 4 的判断

5.位运算符

计算机中的所有信息都是以二进制方式表示的,数字是以其二进制的补码存储的

而对于正数来说,其二进制原码,反码,补码均为相同的;对于负数来说,其反码为符号位保持不变,其余各位取反后再在最后一位上加1

位运算符作用在所有的位上,并且按位运算,在二进制中,每个 1|0 都是一个位

运算符 描述 例子
& 两组二进制数如果相对应位都是1,则结果为1,反之则为0 (3 & 4)得0
| 两组二进制数如果相对应位都是0,则结果为0,反之则为1 (3 | 4) 得7
^ 两组二进制数如果相对应位值相同,则结果为0,反之则为1 (7 ^ 9) 得14
~ 对这组二进制数每一位按位取反,即0变成1,1变成0 (~60) 得-61
<< 对这组二进制数按位左移右操作数指定的位数 (2 << 2)得8
>> 对这组二进制数按位右移左操作数指定的位数 (4>>2)得1
>>> 对这组二进制数按位右移左操作数指定的位数,移动得到的空位以0填充 (60>>>2)得15
/*
a =  0011 1100  = 60
b =  0000 1101  = 13
==================
a&b= 0000 1100 = 12
a|b= 0011 1101 = 61
a^b= 0011 0001 = 49
~a = 1100 0011 = -61
*/

右移一位相当于除2取商;左移一位相当于乘2

//2*8怎样运算效率最快
int a = 2;
System.out.println(a << 3);
//2乘以8 == 2*2*2*2 == 2左移3位
//在系统中运算是以二进制的形式进行的,相比来说俩个二进制数相乘运算比移位运算慢一些

6.扩展运算符

运算符 描述 例子
+= 把左操作数和右操作数相加再赋值回左操作数 a+=b
-= 把左操作数和右操作数相减再赋值回左操作数 a-=b
*= 把左操作数和右操作数相乘再赋值回左操作数 a*=b
/= 把左操作数和右操作数取余再赋值回左操作数 a/=b
%= 把左操作数和右操作数取整再赋值回左操作数 a%=b

7.字符串连接符

在java中一般让两个字符串类型的操作数连接会用 “+” 运算符;如果两个操作数中只有一个是字符串类型,系统会自动将另一个操作数转换为字符串然后再进行连接。

String s1 = " age ";
String s2 = s1 + 24;
int age = 24;
int num = 31;
System.out.println(s2);// age 24
System.out.println(s1 + age);// age 24
System.out.println(s1 + age + num);// age 2431
System.out.println(age + num + s1);//55 age 
//s1 + age + num,是让s1和age进行字符串拼接,再拼接num
//age + num + s1,是计算完age + num,再与字符串s1拼接

8.三目条件运算符

三目条件运算符是按条件来返回需要的结果,格式

x ? y : z

其中x为boolean类型表达式,先计算x的值,若为true,则整个三目运算的结果为表达式y的值,否则整个运算结果为表达式z的值。

int score = 80;
String type = score < 60 ? "不及格" : "及格";
System.out.println("type= " + type);

利用三元运算符做到更加精简代码!便于理解!

9.运算符优先级

先加减,后乘除,所以优先级我们并不陌生。

当多个运算符出现在一个表达式中,就涉及到运算符的优先级别的问题。

下表中具有最高优先级的运算符在的表的最上面,最低优先级的在表的底部

类别 操作符 关联性
后缀 () [] . (点操作符) 左到右
一元 expr++ expr-- 从左到右
一元 ++expr --expr + - ~ ! 从右到左
乘性 * /% 左到右
加性 + - 左到右
移位 >> >>> << 左到右
关系 > >= < <= 左到右
相等 == != 左到右
按位与 左到右
按位异或 ^ 左到右
按位或 | 左到右
逻辑与 && 左到右
逻辑或 | | 左到右
条件 ?: 从右到左
赋值 = + = - = * = / =%= >> = << =&= ^ = | = 从右到左
逗号 左到右

posted @   hello_12153_98  阅读(122)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示