运算符
1.1 概述
算术运算符 |
+ - * / |
基本运算 |
% |
模(取余数),算整除 n%2结果0就是偶数 |
|
++ -- |
自增 自减 |
|
比较运算符 结果是boolean值 |
== |
相等比较 1==2 结果是false |
!= |
不等比较 1!=2结果是true |
|
逻辑运算符 |
&& & 结果是boolean值 |
逻辑与(短路与),两边同为真结果才为真 |
|| | 结果是boolean值 |
逻辑或(短路或),两边只要有一个真结果就是真 |
|
+ |
字符串连接 |
|
! |
非,非真是假,非假是真 |
|
三元运算符 |
?: |
三项运算 1 ? 2 : 3 1是真取2,1是假取3 |
赋值运算符 |
= |
赋值运算 |
+= -= *= /= |
复合的赋值运算 a+=2;//a=a+2 |
整数不可以除以0回报异常
小数可以除以0 如2.0/0 值为Infinity -2.0/0值为-Infinity Infinity是无穷大的意思
0.0/0 得到的结果是NAN 翻译过来是NOT A NUMBER
0/0.0结果也是NAN
操作%
最终结果值的正负号与左边的数一致
-2/-5 值为-2 2/-5 值为2
++ 和-- 如果在操作数的后面,先赋值再自加自减 c=a++;
放在操作数的前面,先自增自减后赋值
a=2;
system.out.printf(a++);//2
a++;//3
byte c=127;
c++;//-128 强制类型转换
++ -- 在运算的时候会有默认的强制类型转化
byte c=Byte.MAX_VALUE; System.out.println(++c); //-128 short a=Short.MAX_VALUE; System.out.println(++a); //-32768 int b=Integer.MAX_VALUE; System.out.println(++b); //-32768 char d=Character.MAX_VALUE; System.out.println((int)++d); //要强转 0
byte,short,char 再进行运算的时候会自动提升为Int类型 如下面
byte a=3;
a=a+3; //这个会报错 因为a+3结果提升为int类型 ,a是byte 那么类型大转小会报错
a+=3 //相当于a=a+3 但是此时byte a的结果是对的因为会默认加上强制类型转换
赋值运算符
=
变量没有连等定义
int a=b=c=3;这个是错的这个只有a是int类型的,其他的b,c不知道类型
连等赋值
a=3;
int b=a+=a-=a*=5;
最后b等于-9
先带入 b=3+=3-=3*=5
赋值时从右往左走
b=3+=3-=15 -->b=3+=-12-->b=-9
int b=a+=a-=a*=a++; 结果是-3 b=3+=3-=3*=3 -->b=3+=3-=9-->b=-3
int d=a++ + ++a; d等于8 3+5
变量左边改变的值可以影响到右边的值 而右边改变的值不能影响到左边已经编译好的值
扩展形式 +=、-=、*=、/=、%=、&=(按位与等)、|=(按位或等)、^=(按位异或等)、>>=(按位右移等)、<<=(按位左移等)、>>>=(无符号右移等)
底层默认有强制类型转换。
比较运算符
==、>、<、>=、<=、!=
逻辑运算符
用于连接左右两边布尔值或者布尔表达式的符号
表达式:用于连接数据或者变量而且符合java语法的式子 a+b(算数表达式) a>b(比较表达式)
&(逻辑与) ,|(逻辑或),^(逻辑异或).!(逻辑非)
得到的结果是boolan值
&表示并且的关系
单与&: 表达式1 & 表达式2 结果是true,两个表达式必须都是true
双与&&: 表达式1 && 表达式2 结果是true的话,两个表达式也都是true
区别:但是如果&&左边的布尔值是false就默认不执行右边即&&的短路
-- 短路与,如果表达式1的值是false,结果会造成表达式2的短路
|表示或者的关系
单或|:表达式1 | 表达式2 ,最终的结果要true,要求两个中有一个是true就可以
双或||:表达式1 || 表达式2,最终的结果要true,要求两个中有一个是true就可以
区别:但是如果||左边的布尔值是true就默认不执行右边即||的短路
--短路或,如果表达式1的值是true时,表达式2会被短路
||在&&的前面,如果||发生了短路就会把&&短路掉
if(true||(a++!=b)&&(c-->b)) ||右边的都不执行。
如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public class HellowWorld { public static void main(String[] argv ) { int a= 1 ; int b= 2 ; int c= 3 ; if ( true &&(a++!=b)||(c-->b)) { } System.out.println(a); System.out.println(b); System.out.println(c); } } |
结果是:223
public class HellowWorld { public static void main(String[] argv ) { int a=1; int b=2; int c=3; if(true||(a++!=b)&&(c-->b)) { } System.out.println(a); System.out.println(b); System.out.println(c); } }
结果是1 2 3
^ 异或相同为false 不同就是true
位运算
要进行位运算前提是把所有的数据转成二进制数据的补码
&(按位与)、|(按位或)、^(按位异或)、~(按位取反)、>>(右移)、<<(左移)、>>>(无符号右移)
两边是值的话就是按位与 两边是布尔的话就是逻辑与
任意一个正数&任意一个数结果是正数
&:遇0则0
任意数&1==0 代表的就是偶数 ,&1==1代表的就是奇数
|:遇1则1,任意一个负数|任意一个数结果为负数 因为符号位是1
^:不同为1,相同为0
异或的扩展:a^b^a 和b^a^a 结果都是b 即一个数按位异或其它数两次得到的结果就是其本身
~:先按位取反 正数的补码符号位会变成1 ,那么就是负数的补码 ,那么需要转成原码的值
如 3的补码是00000000 00000000 00000000 00000011
按位取反:11111111 11111111 11111111 11111100符号位也要取反
负数变成反码11111111 11111111 11111111 11111011
原码 10000000 00000000 00000000 00000100 结果是-4
当左右移的运算数是byte 和short类型时,将自动把这些类型扩大为 int 型
>>(右移) ---右移几位就要补几位,如果是正数,那么右移几位就在最高位(最左边)补几个0,如果是一个负数,右移几位就在最左边补几个1
都是补码在进行左移右移。
<<(左移)--无论正负数左移几位就在最右边补几个0
>>>(无符号右移) ---无论正负数,右移几位就在最左边补几个0
int类型的值无论左移还是右移几位都是要%32,如右移33位和右移一位是一样的
byte short char在底层是已int范围来存储的。
public static void main(String[] argv ) { int a=8; int c=-8; int b=2; System.out.println(a>>b); //a右移两位 2 System.out.println(a<<b); //a左移两位 32 System.out.println(a>>>b); //a无符号右移2位 2 System.out.println(c>>b); //c右移两位 -2 System.out.println(c<<b); //c左移两位 -32 System.out.println(c>>>b); //c无符号右移2位 1073741822 }
三目运算符 (最后一定返回的是一个值)
表达式(结果一定是布尔值)?表达值1:表达值2
1.返回值的类型一定要保持一致
public static void main(String[] argv ) { int a=8; int c=-8; int b=2; int max=a<b?(b<c?c:b):(a<c?c:a); //三目嵌套 a<b?b:a 等于知道了b再与c做比较 System.out.println(max); }
int a=5; int b=9; int c=2; int max=a>b?(a>c?a:c):(b>c?b:c); System.out.println(max);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步