【第三天】六大运算符(算术 赋值 比较关系 逻辑 位 三元)

复习:
1. 入门程序:javac -d ---编译 java -cp ---运行
2. 关键字:在java中有特殊含义的单词---53,51---const,goto
3. 标识符:自定义的名称---命名规则---驼峰命名法
4. 注释:解释说明程序的文字
5. 计算机常量:整数、小数、字符、字符串、布尔、空
6. 进制:计数方式---二-0b、八-0、十、十六-0x---掌握进制之间的换算
7. 变量:三个要素---数据类型、变量名、数据---先定义、先赋值后使用
8. 数据类型:基本类型(byte/short/int/long/float/double/char/boolean)、引用类型---数组、类、接口
9. 类型的转换:隐式类型转换(小转大,整转小,字转整)、显式类型转换

 

 

转义字符
用其他的符号代替一些无法直接表示的字符。
制表符 \t --- table--- char c = ‘\t’;
回车 \r ---return  换行 \n ---next
\\ 反斜杠\  \’ 单引号  \” 双引号


操作符/运算符


算术运算符
+ - * / % ++ --
+ - * /
byte b1 = 3;
byte b2 = 4;
byte b = b1 + b2; --- 因为byte在运算的过程中会自动提升为int类型
byte b = 3;
b = b + 3;
注意:

1. byte/short在运算的时候会自动的提升为int
2. double/float类型在计算过程中不保证精度---绝大部分小数转化为二进制的时候无法精确表示
3. java是一门强类型的语言---如果只有一种类型在参与运算,那么结果一定是这种类型
4. 整数/0 -> ArithmeticException 非0小数/0或者非0数字/0.0 -> +/-Infinity (int/double)0/0.0 0.0/0 0.0/0.0-> NaN --- Not a Number

 

 

 

%---取模运算---取余运算
7%3=1 25%7=4
-7%3=-1 -25%7=-4
7%-3=1 25%-7=4 ---在做取余运算的时候,先忽略掉两个数字的符号,按照正数的取余进行运算,运算完成之后看%左边的数字的符号,如果左边为正数,那么结果就是正数,如果左边为负数,结果就是负数
-7%-3=-1
3.5%2=1.5 -5%1.7=-1.6  5.5%1.8=0.1

 

 

++ 自增
在自己本身的基础上来增加1
int i = 3;
i++; i -> 4 -> i = i + 1;
int i = 3;
int j = ++i; -> 先把i的值3取出来,i进行自增,i变为了4,然后再将i的值4赋值给j,j的值也就是4了
int i = 3;
int j = i++; -> 先把i的值3取出来,i进行自增,i变为了4,然后将取出来的3再赋值给j,j的值就是3了
int i = 3;
int j = ++i + 1; -> i先自增为4,然后将4取出来再+1,求出和为5,然后将5赋值给j,所以此时j的值为5
int i = 3;
int j = i++ + 1; -> 先将i的值3取出来+1,然后i自增,然后再将3+1的和计算出来再赋值给j,所以此时j的值为4
++在前的话是先自增再参与后续运算;++在后先参与后续运算,再自增
int i = 5;
int j = ++i * 2; -> i先自增为6,然后再乘以2,所以j的值为12
int i = 5;
int j = i++ * 2; -> 先将i的值5取出来乘以2,然后i自增为6,然后将5 * 2的值赋值给j,所以j的值就是10
int i = 7;
int j = ++i + i++; -> i先自增为8,8参与后续运算的时候,发现后边出现了i++。i经过前面的自增已经变为了8,此时是将8取出来与前面的8来运算,所以j的值为16
int i = 7;
int j = i ++ + ++i; -> 先将i的值7取出来,i自增为8,后续的++i有i已经变为了8,所以再次自增变为了9,所以此时是7+9=16

 

 

 

-- 自减

就是在本身的基础上-1
int i = 5;
int j = i--; -> i = 4;j = 5
int i = 8;
int j = i-- - --i; i = 6;j = 2
int i = ‘a’ + ‘d’;
int j = ‘中’ + ‘国’; ---char类型可以参与运算,结果会是整数int类型
byte b = 5;
b++; --- byte/short可以参与自增/自减运算,而且运算完成之后类型是原来的类型不变

 

 

 

赋值运算符
=   +=   -=    *=     /=        %=       &=      |=      ^=        <<=        >>=         >>>=
int i = 4;
i <<= 2; ->      i = i << 2; ->     i = 16

int i = 5;
i &= 3; ->       i = i & 3;-> i = 1;

int i = 5;
i += 3; ->      相当于i = i + 3; -> i = 8;

int i = 10;
i -= 4; ->       i = 6

int i = 15;
i %= 5; ->        i = 0; ->    i = i % 5;

除了=以外,其余的赋值运算由于有了附属操作,因此都要求这个变量要先有值才能运算
byte/short类型可以参与赋值运算
 

int i = 5;
i += i -= i*= 5; ->     i = -15 -> i = 5 + (5 - (5 * 5));

int i = 5;
i += i -= i*= ++i; -> i = -20 -> i = 5 + (5 - (5 * 6))

int i = 5;
i += i -= i*= i++; -> i = -15 -> i = 5 + (5 - (5 * 5));
int i = 5;
i = i++; -> i = 5;-> 先将i的值5取出来,然后i自增为6,但是最后要把5再赋值给i

 

 

 

 

比较/关系运算符
> < >= <= == !=
== 用于判断两个数据是否相等
3 == 4 -> false
3 != 4 -> true

 

 

 

逻辑运算符
用于运算逻辑值(布尔值)的---针对true/false进行运算

&与---And |或---Or !非---Not ^异或---Xor &&短路与 ||短路或
true&true=true true&false=false false&true=false false&false=false
true|true=true true|false=true false|true=true false|false=false
!true=false !false=true
true^true=false true^false=true false^true=true false^false=false

 

 

 

&&:如果前面表达式的结果为false,后边的表达式则不再计算
int i =3, j = 4;
boolean b = i > 3 && j++ > 1; -> b = false; j = 4

 

 

||:如果前面表达式的结果为true,则后边的表达式不再计算

在短路与和短路或中,短路或可以把短路与给短路掉,但是短路与不能把短路或给短路掉

 

 

 

位运算符

 

 

注意:位运算针对整数的补码进行运算
数据的原反补三码---任何数据在计算机中存储的时候存的是其补码,运算的也是补码。---以后在程序中写的二进制数字默认就是补码形式
原码:将一个数据转化成的二进制形式就是其原码
对于正数,规定它的原反补三码一致
对于负数,反码是在原码的基础上,最高位不变,其余位0->1,1->0;负数的补码实在反码的基础上+1
最高位用作了一个符号位,在转化为十进制的时候不参与运算---如果最高位为0,则该数是一个正数;如果最高位为1,则该数是一个负数
5 -> 00000000 00000000 00000000 00000101 ---原码/反码/补码
-5 -> 10000000 00000000 00000000 00000101 --- 原码
   11111111 11111111 11111111 11111010 --- 反码
   11111111 11111111 11111111 11111011 --- 补码
& | ^ << >> >>> ~

 

与& 同1为1

或 | 同0为0 

非!直接去反

异或 ^ 相同为0 不同为1 

 
a^b^b = a -> a^b^b = b^b^a = 0^a=a

 

 

 

 

交换两个数的值方式:
方式一:利用第三方变量---追尾法
int i = 3, j = 5;
int temp = i;
i = j;
j = temp;
方式二:加减法
int i = 3, j = 5;
i = i + j;
j = i - j; -> j = (i + j) - j; -> j = 3;
i = i - j; -> i = (i + j) - i; -> i = 5;
方法三:异或法
int i = 3, j = 5;
i = i ^ j;
j = i ^ j; -> j = i ^ j ^ j; -> j = 3
i = i ^ j; -> i = i ^ j ^ i; -> i = j ^ i ^ i; -> i = 5;
i ^= j; j ^= i; i ^= j;
注意:在做移位运算的时候,实际上不是直接计算要移动的位数,而是先将这个位数取余32,然后移动取余32之后的余数3 << 40          3 << (40 % 32)  =  3 << 8 = 768

 .

 


 


>>> : 无符号右移。向右移动完成之后无论正负一律补0.---对于正数而言,右移和无符号右移一样;对于负数,负数右移完成之后一定是负数,但是无符号右移之后会变成一个正数
 


int i = 3;
i = ~i++; -> 先将i的值3取出来参与取反运算,i自增为4,然后将~3的结果赋值给i,所以i的值就是-4
int i = 5;
i += i -= i *= ~i++;   ->    i=  i+( i-(   i*(~i)  ) )     ->      i = 40

 

 

三元运算符
逻辑值 ? 结果1 : 结果2
如果逻辑值为true,那么执行结果1;反之,执行结果2
 
i > j ? System.out.println(i) : System.out.println(j) ;---不行---因为三元运算符也是一个运算符,只要是运算符就需要一个结果---是指能用一个变量来接住最后的结果
int k = i > j ? i : j;
int k = i > j ? i + j : true; --- 要求前后两个结果的类型要一致或者能够自动转化
double d = i > j ? 3.5: 5;
当三元表达式形成嵌套的时候,尽量加上()
如果java文件中出现了包,想自动的生成包所对应的文件夹,那么就使用javac -d
 
如果不添加参数-d,那么这个时候无法生成文件夹,而编译出来的class文件默认也会和java文件放到同一个位置
 

posted @ 2018-01-03 20:31  songyao  阅读(226)  评论(0编辑  收藏  举报