运算符

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))   ||右边的都不执行。

如:

 

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);

 

原文地址:https://www.cnblogs.com/xuwangqi/p/11026726.html