智渔课堂官方免费教程五:Java基础之运算符

一、运算符


一、按运算类型分为

算术运算符

用于数值类型之间的数学运算,结果也为数值类型
byte a = 15;
byte b = 10;

运算符含义实例结果
+加法a + b和:25
-减法a - b差:5
*乘法a * b积:150
/除法a / b商:1
%取余a % b余数:5
++自增1a++:先取出变量a的值参与其他运算,再执行自增1
++a:先执行自增1,再取出变量a的值参与其他运算
//先取出a的值赋值给c,在执行a自增1;结果:c的值是15,a的值是16
int c = a++;
//重新给a赋值为15
a = 15;
//先执行a自增1之后a的值为16,在取出a的值赋值给d,所以d的值也是16
int d = ++a;
--自减1a--:先取出变量a的值参与其他运算,再执行自减1
--a: 先执行自减1,再取出变量a的值参与其他运算
同上


       如果参与数学运算的数据类型,是小于或等于int类型中的任意几种类型参与运算,得到的结果都是int类型的,如果有大于int类型的数据类型参与运算,其结果的数据类型就是表达式中最大的数据类型。



实例:
/**
 * 演示算术运算
 * @author学霸联盟-赵灿
 */
public class ArithmeticOperationDemo {
    public static void main(String[] args) {
       //声明一个byte类型的变量a,并赋值为10
       byte a = 10;
       //声明一个short类型的变量b,并赋值为15
       short b = 15;
       //使用变量a和b进行加法运算,其结果为int类型
       //如果要将结果赋值给byte类型的变量,就必须进行强制类型转换,否则会出错
       byte c = (byte) (a + b);
       //声明一个double类型的变量d,并赋值为1
       double d = 1;
       //运算表达式中最大的数据类型是double,所以结果的数据类型也是double
       //现在声明int类型的变量i接受表达式的结果,就必须进行强制类型转换
       int i = (int) (c + d);
    }
}


关系运算符

用于数值类型之间的比较,得到的结果为布尔类型


运算符含义实例结果
>大于boolean b = (1>2)b的值为false
小于boolean b = (1<2)b的值为true
>=大于等于  boolean b = (1>=2)b的值为false
<=小于等于boolean b = (1<=2)b的值为true
==等于boolean b = (1==2)b的值为false
!=不等于boolean b = (1!=2)    b的值为true


逻辑运算符

操作数为boolean类型的数据上;得到的结果也是boolean类型;

boolean  a = false;
boolean  b = false;
boolean  c = true;
boolean  d = true;


运算符含义实例结果
&& 或 &逻辑与a&&b 结果为false
a&&c结果为false
c&&b结果为false
c&&d 结果为true
两个操作数同时为true时,结果为true;任意一个操作数为false,结果就为false
|| 或  |逻辑或a||b 结果为false
a||c结果为false
c||b结果为false
c||d 结果为true
两个操作数同时为false的时候,结果才为false;有任意一个为true,结果就为true
!逻辑非!a结果为true
!c结果为false
只有一个操作数,操作数放在符号右边
操作数为true,结果为false;操作数为false,结果为true
^逻辑异或a^b结果为false
a^c结果为true
两个操作数相同,结果为false
两个操作数不同,结果为true

&&和&:都是逻辑与;

||和|:都是逻辑或;

他们的使用方式一样,得到的结果也一样

但是&& 和 || :具有短路功能;
       &&:左边的操作数为false时,就已经可以确定表达式的结果一定为false了,所以就不会在执行右边的操作了
       ||:左边的操作数为true时,就已经可以确定表达式的结果为true了,所以就不会执行右边的操作了

这里涉及到流程控制,下一篇文章再演示这个问题


位运算符(这里涉及到二进制的知识较多,初学者可以选看)

      位运算符是将整形数据值转换成二进制的补码,将二进制补码靠右对齐(二进制位数少的在左侧补0),对齐位上的值进行运算,运算后得到的二进制是结果的补码,将结果的补码转换成二进制原码,再将二进制原码转换成十进制值

      在java语言中,一个有符号的整型数据的二进制最左侧的一个二进制位(最高位)被用来代表这个值的正负号(0代表正号,1代表负号)

那么如何将十进制转换成二进制呢?

      例:十进制的13转换成二进制

            13/ 2 商6 余1

            6 / 2 商3余0

            3 / 2 商1余1

            1 / 2 商0余1

      得到的余数倒序排列,所有十进制的13转换成二进制的结果为1101


二进制转换成十进制

      例:二进制的1101转换成十进制

             取出最右边一位的值是1,乘以基数2(基数:几进制基数就是几)的0次方

             取出右边第二位的值是0,乘以基数2的1次方

            取出右边第三位的值是1,乘以基数2的2次方

            取出右边第四位的值是1,乘以基数2的3次方

            如果还有更多位,依次进行同上的运算,然后将上面运算的结果相加;(1×20)+ (0×21)+(1×22)+ (1×23) 结果为13


二进制的三种码制

      原码:通过对其他进制的数值转换获得

      反码:符号位不变,其他位取反

      补码:反码+1

      正数的原码、反码、补码相同,不需要计算

      例:byte b = -6;

      byte类型的长度为8位

      所以b的二进制原码为10000110;其中最高位(最左侧)为1,代表这是一个负数,右侧所有位代表值

      反码为:11111001(符号位不变,其他位取反)

      补码为:11111010(二进制逢二进一)


位运算符的操作数只能是整型数据或char类型数据,结果为整型数据

运算符含义实例结果
&按位与1&1结果为1
1&0结果为0
0&0结果为0
如果两边都是1,结果为1
任意一边为0,结果就为0
|按位或1|1结果为1
1|0结果为1
0|0结果为0
如果两边都是0,结果为0
任意一边为1,结果为1
~按位取反~0结果为1
~1结果为0
只有一个操作数,在符号的右侧
如果当前位为1,结果为0
反之,则为1
^按位异或1^1结果为0
0^0结果为0
1^0结果为1
两边相同,结果为0
两边不同,结果为1
<<有符号左移操作数 << 移动的位数符号位不动,其他位依次向左移动,移动之后的空缺位补0
>>有符号右移操作数 >> 移动的位数符号位不动,其他位依次向右移动,移动之后的空缺位补最高位
>>>无符号右移操作数 >>> 移动的位数符号位和其他位一起向右移动,移动之后最高位补0

首先要注意:为运算会将小于int类型自动转换成int类型来运行,运算结果为int类型。所以运算时是32位二进制。
实例:将13向左移动1位(13<<1);先将13转换成二进制1101(正数符号位为0,这里就简写成4位了),正数的原码反码补码相同,所以直接移动即可,每一位依次左移一位,最后补一个0,结果是11010,转换到十进制为26
           将13向右移动1位(13>>1);结果是110,最右边的1被移除了,转换到十进制为6
           正数的最高位为0,所以无符号和有符号的右移结果一样
           有符号左移:int或long类型转换成二进制后,只要左边第二位上不为1,结果就是原值乘以2;如果第二位上为1,在左移时,这个1会被移除,所以结果不是乘2
           有符号右移:就是除以2;
                                 但要注意-1有符号右移任意多位,结果仍然为-1。这是因为计算机是使用补码进行运算的。
                                 原码:10000001(简写为8位,实际应该是32位)
                                 反码:11111110(符号位不动,其他位按位取反)
                                 补码:11111111(反码+1)
                   位移后的补码:11111111(最右边的1被移除,在左边第二位上补最高位,负数的最高位是1,所以位移后结果未发生变化)
                          结果反码:11111110(补码-1)
                          结果原码:10000001(-1)
           无符号右移:原值为正数,结果为原值除以2;但要注意负数的无符号右移。
                         例:-1>>>1
                     补码:11111111111111111111111111111111(32位1)
      位移后的补码:01111111111111111111111111111111(注意:这里是连同符号位一起位移,位移后最高位补0;补0后就变成了一个正数,正数的原码反码补码相同,所以这是一个非常大的正数)



赋值运算符

单一赋值运算符:=

复合算术赋值运算符:+=  -=  *= /=  %=

复合位赋值运算符:&=  |=  ^= <<=  >>=  >>>=

复合赋值运算符中间不能有空格;注意没有~=

常量名或变量名 = 常量值或另一个变量或运算表达式

将=右边的值,存储到左边的变量或常量中;需要使用时,使用左边的变量名或常量名获取值

如:int a = 10; int b = a; int c = a+b;都可以;结果是a和b的值都为10;c的值为20

运算符含义实例结果
=赋值int  i = 10;变量i的值是10
+=加后赋值a+=b等价于a=a+ba的值为25,b的值不变
-=减后赋值a-=b等价于a=a-b先运算减法,在运算赋值操作
*=乘后赋值同上同上
/=除后赋值同上同上
%=取余后赋值同上同上
&=按位与后赋值同上同上
|=按位或后赋值同上同上
^=按位异或后赋值同上同上
<<=左移后赋值同上同上
>>=右移后赋值同上同上
>>>=无符号右移后赋值同上同上

 

条件运算符:?:

运算符含义实例结果
? :布尔表达式?结果1:结果25>6 ? “对” : “错”先进行5>6的比较运算,得到的结果是字符串类型的值:“错”
如果布尔表达式的结果为true;整个表达式结果为:结果1;反之,结果为:结果2

注意:如果结果出现了不同的类型,接收这个表达式的值时,必须是能够存储两种结果类型的数据类型

例:byte  b = 1;

long i= 2;

//虽然此处result得到的结果是变量b的值,但是result不能声明成byte类型的,要声明称long类型;如果result声明成比long类型小的类型,需要对结果进行强制类型转换

int result = b<i ? b : i ;

 

字符串连接符:+

只要表达式中出现了一个字符串,运算时从左向右运算,从第一个出现的字符串开始,将其后的所有其他类型的值转换成字符串,并将各个字符串连接到一起

例:"字符串1"+"字符串2" 的结果为:"字符串1字符串2"

"字符串" + 1 + 2 的结果为: "字符串12"

1+ 2 + "字符串" 的结果为: "3字符串"

二、按操作数的个数分类

       只需要一个操作数的运算符,一元运算符,单目运算符

       需要两个操作数的运算符,二元运算符,双目运算符

       需要三个操作数的运算符,三元运算符,三目运算符


二、Java的基本语句

表达式语句

   表达式是由常量、变量、方法调用和运算符组合起来的式子

例如:

//声明表达式

int a

//赋值表达式

a = 10

//算术运算表达式

a++

给这些表达式加上一个英文格式的分号,就是表达式语句

例如:

//声明语句:意义是声明了一个int类型的变量a

int a;

//赋值语句:意义是给变量a赋值为10

a = 10;

//自增语句:意义是给变量a自身增加1

a++;

空语句

只有一个英文格式的分号组成的语句叫空语句

//空语句

;

复合语句

    将任意多种类语句的一条或多条语句用大括号{}括起来形成一个整体,这个整体(含大括号)称复合语句,java中也称为代码块。

例如:

{

int a = 10;

a++;

int b = a+10;

boolean bool = a>10;

System.out.print(a);

}

           原码:10001101(简写为8位,实际应该是32位)

           反码:11110010(符号位不动,其他位按位取反)

           补码:11110011(反码+1)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值