JAVA基础之运算符

来源:互联网 发布:淘宝怎么做虚拟产品 编辑:程序博客网 时间:2024/06/07 00:44
算术运算符:+ - * /  (加减乘除)
大部分和生活里面的运算是一样的,有个特殊情况需要注意。
例如:*/
int x = 6570;
x = x/1000*1000;


/*
上面运算中,如果按照生活中的运算结果应该还是6570.
但在JAVA虚拟机中的运算结果是6000.
因为6570除以1000的结果是6.57,JAVA是强类型语言,x为int类型,在这一步的时候,底层自动将
6.57转为整数,也就是6. 6乘以1000得到的结果是6000.
这是JAVA的特点,需要注意。


% 取余,模运算 两数相除,如果有余数就只取余数,如果没有则是0.
例如:
*/
int  a=5%3;
/*
这里,5除以3等于1,余数为2.模运算就是取余数,所以得到的结果是2.
没有余数时得到的结果就是0.
如果左边的数小于右边的数,无法运算,结果直接就是左边的数。
比如 2%5 无法运算,结果就直接是2.


+号同时也是连接符,用于输出时与字符串连接。


++  自增1  --  自减1




赋值运算符:= +=  -=  *=  /=  %= (赋值 加等 减等 乘等 除等 模等  )
= 就是赋值  右边的值赋给左边   x = 3  意思就是把右边的3赋给左边的x
+=  加等 将左右两边的和赋给左边。
例如:*/

int b =5;
b+=2;//b= b+2 可以这样理解(运算过程不是如此)  就是将b原来的值5加2 再赋给左边的b  所以结果是7.

//同理,减等就是将两边的差赋给左边。

int c=8;
c-=3;//结果是5.

//乘等和除等的原理同上。
//赋值运算符的特点就是遇到不一样的数据类型时,它会在底层自动进行数据类型转换。例如:
short  d =5;
//d=d+2; 这里是会报错的,因为2默认是int类型。
//应该写为
d=(short)(d+2);
//这一步就是强制类型转换。


/*
比较运算符:> 大于 < 小于  >= 大于等于  <=小于等于 == 等等于  != 不等于
比较运算符是判断表达式的结构符号,结果只能是true和false 



逻辑运算符:用于连接两个Boolean类型的判断表达式。
&:与符号。 */
int e=7;
//System.out.println(2<e&10>e);
/*
Boolean表达式的结果只能是true或false  &与符号用于连接两边表达式的正确性再进行判断
上面我们定义的e为7 2<7 同时 10>7 两边表达式的结果都为true  所以它的结果也是true。
&与符号的运算特点:
true & true = true;
true & false = false;
false & true = false;
false & false = false;
说明在&与运算中,只有两边表达式为true 结果才能为true,否则都为false。


|:或运算符的特点:
true | true = true;
false | true = true;
true | false = true;
false | false = false;
说明在|或运算符中,只有两边都为false时结果才为false,其余都是true。

^异或运算符特点:
true ^ true = false;
false ^ true = true;
true ^ false = true;
false ^ false = false;
和|的唯一区别是两边为true时,结果为false。其余和|或运算符的结果全部一样。
意思说两边结果相同时为false,不同时为true。


! 非运算符,判断事物的另一面。
!true = false;非真就是假
!false = true;非假就是真


&& 双与
和&与的运算结果一样,只是过程有区别。
&是无论左边的运算结果是什么,右边都参与运算。
&&是只要左边为false,右边不参与运算,即短路。


|| 双或
和|的运算结果一样,过程有区别。
|是无论左边的运算结果是什么,右边都参与运算。
||是只要左边为true,右边不参与运算,即短路。


&和&&的区别 |和||的区别很可能是面试题,一定要重点掌握。




位运算符:用于二进制位运算的符号。


&运算符 &不仅是逻辑运算符,同时也是位运算符。
比如 6&3 它的结果应该是这么来的
位运算是二进制运算,所以得把两个数转换成二进制数再进行运算
为了方便,这里不再将两个数的32位全部写出来,只保留有效位即可。
6的二进制数为 0110  3的二进制数为  0011
在二进制中 0就是false  1就是true 所以
0110
&0011
0010 二进制转换过来是2 它的结果就是2
&运算的判断结果参考&作为逻辑运算符是的判断方法。两个为true才为true,也就是1.


|运算符:和&一样,同是逻辑运算符,也是位运算符
比如 6|3 算法与上面同理,判断结果也是根据|作为逻辑运算符时的结果。
      0110
          |0011
  0111  转换过后是7 所以结果是7


^异或运算符
6^3  ^异或的特点就是两边相同为false,不同为true。
0110
  ^0011
   0101 转换过来是5 
^异或有个特点:
一个数被同一个数异或两次后得到的还是原数。这个特点可以用于数据加密。


总结:&与运算 |或运算 ^异或运算  这三种运算方法,有一个共同的特点。
那就是相运算的两个数位置即使互换,结果还是一样。


~反码,数值取反。
整数的负数二进制表现形式为取反再加1  
这里就只是取反  未加1  所以一个整数取反的数就是他的负数再减1.
~8 的反码是 -9   ~7的反码是-8  就是这样
反码不常用,几乎不用。


<< 左移运算符
3<<2
首先还是转换为二进制,这里涉及到移位,为方便理解,把全部字节都写出来
0000-0000 0000-0000 0000-0000 0000-0011
左移两位就是将整个数值的字节往左移动两个数值并舍弃 后面空出来的两个数值位用0弥补。
得到的结果就是:
0000-0000 0000-0000 0000-0000 0000-1100
也就是12 
由此我们可以看出 一个数左移一位得到的数就会是原数的2倍,也就是乘以2.再移动一位就再乘以2.
一个数左移几位其实就是该数乘以2的几次方。


>>右移运算符。和左移差不多。
需要注意的是,右移时,原数最高为是0就拿0补位,是1就用1补位。
同样我们可以看出特点  右移几位其实就是该数除以2的几次方、
例如:8>>2 得到的结果2.


>>>无符号右移  和右移原理是完全相同的
区别在于  无符号右移时,不管原数最高位是什么,都拿0去补位。






练习,将两个变量的值进行互换。
通常情况下,我们应该建立一个临时的第三方变量来进行存储,然后再互换前两个变量。
*/
int f=3,g=6;
/*int h;
h=f;//这里h等于3
f=g;//这里f等于6
g=h;//这里g等于3
//再提一个要求,再不允许使用第三方变量的情况下,我们应该怎么互换?
//我们可以用两者的和来进行运算。
f=f+g;//这里f=3+6
g=f-g;//g=3+6-6;g=3;
f=f-g;//f=3+6-3;f=6;
不过这种方式不建议用,因为如果两数过大,超出数据类型范围的话,容易强制转换,数据丢失。

我们知道一个数异或同一个数两次还能得到原数,所以这里我们可以用异或来解决问题。
*/
f=f^g;//这里f的值开始变化。
g=f^g;//3^6^6=3;g=3;
f=f^g;//3^6^3=6;f=6;


/*不过这种方式阅读性很差,一般面试才会用。
开发时一般还是用第三方变量方式比较多,阅读性强,好理解。




三元运算符: (条件表达式)?表达式1:表达式2;
如果条件表达式结果为true,则运算表达式1;
如果条件表达式结果为false,则运算表达式2;
例如:*/
int h=5,y;
y=(h<3)?200:400;
0 0
原创粉丝点击