Java基础:第十讲 基本运算——运算符

 

基本运算
本次主要介绍如何使用Java 提供的各种运算符进行基本的运算。
主要内容:
n   算数运算符;
n   赋值运算符;
n   自增、自减运算符;
n   比较运算符;
n   逻辑运算符;
n   位运算符;
n   移位运算符;
n   条件运算符;
n   字符串连接运算符。
算术运算符
1)用法
标准的算术运算符有:+ - * / % 。分别表示加、减、乘、除和求余。另外“+ ”和“- ”也可以作为单目运算符,就像现实世界中的“正”和“负”。
【例1 】下面的程序演示了这几个运算符的用法。
// MathmeticsOperationTest.java
public class MathematicsOperatorTest {
 public static void main(String[] args) {
      // 定义整形变量a,b,分别赋值207
      int a=20;
      int b=7;
     
      // 进行加、减、乘、除和求余运算
      int sum = a+b;
      int sub = a-b;
      int mul = a*b;
      int div = a/b;
      int res = a%b;
     
      // 输出运算的结果
      System.out.println("a="+a+" b="+b);
      System.out.println("a+b="+sum);
      System.out.println("a-b="+sub);
      System.out.println("a*b="+mul);
      System.out.println("a/b="+div);
      System.out.println("a%b="+res);
 }
}
运行结果如下:
a=20 b=7
a+b=27
a-b=13
a*b=140
a/b=2
a%b=6
【注意】整数运算的结果仍然是整数,例如:12/8 = 1 ,而不是1.5
2)类型转换
不同类型的数字进行运算的时候,系统会强制改变数据类型,例如下面的代码:
【例2
// TypeConvert.java
public class TypeConvert {
 public static void main(String[] args) {
      byte b1 = 3;
      byte b2 = 4;
      byte b3=b1+b2;
 }
}
在编译的时候会报下面的错误:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
 Type mismatch: cannot convert from int to byte
 at TypeConvert.main(TypeConvert.java:6)
原因在于执行b1+b2 的时候,系统会把b1 b2 的类型都转换成int 类型然后计算,计算的结果也是int 类型,所以把int 类型赋值给byte 类型,这时候就产生错误了。
类型转换的基本规则如下:
     操作数中如果有double 类型,则都会转换成double 类型。
     如果有float 类型,则会转换成float 类型。
     如果有long 类型,则会转换成long 类型。
     其他的都会转换成int 类型。
如何解决上面的错误呢?可以参考下面的代码:
【例3
// TypeConvert2.java
public class TypeConvert2 {
 public static void main(String[] args) {
      byte b1 = 3;
      byte b2 = 4;
      // 对计算结果进行强制转换
      byte b3 = (byte)(b1+b2);
 }
}
赋值运算符
1)基本赋值运算符
= ”是赋值运算符,其实前面的很多例子都用到过。
用法:左边是变量,右边是表达式。
作用:把右边的表达式的值赋给左边的变量。
例:
int a = 5; // 直接赋值
a = a+3;    // 赋表达式
2)复合赋值运算符
赋值运算符与其他运算符结合使用完成赋值的功能。看下面的示例:
【例4
// CompoundOperator.java
public class CompoundOperator {
 public static void main(String[] args) {
      // 使用复合赋值表达式计算a+3,并把结果赋值给a
      int a = 3;
      a += 3;
     
      // 不使用复合赋值表达式计算b+3,并把结果赋值给b
      int b = 3;
      b = b+3;
     
      // 分别输出ab的值
      System.out.println("a = "+a);
      System.out.println("b = "+b);
 }
}
运行的结果如下
a = 6
b = 6
     基本格式
a X= b ;
X ”表示其他的运算符,可以是各种运算符。
     作用
使用左值与右值进行基本的“X ”运算,然后把运算的结果赋值给左值,相当于下面的代码:
     a = aXb ;
大部分的运算符都可以和赋值运算符结合使用构成复合赋值运算符。
自增、自减运算符
自增运算符
1 )自增运算符的基本功能就是把自身增加1 ,假设操作数是x ,自增运算符可以有两种格式:
x++
++x
两种格式的效果是相同的,都是把x 的值增加了1 ,相当于:
x = x+1;
但是,当自增运算符和赋值运算符一起使用的时候,两种格式的效果是不一样的,例如:
y = x++; y = ++x;
前者相当于:
y = x;
x = x+1;
后者相当于:
x = x+1;
y = x;
【例5
// AddOne.java
public class AddOne {
 public static void main(String[] args) {
      int x1=3;
      int x2=3;
      // ++在后面
      int y1 = x1++;
      // ++在前面
      int y2 = ++x2;
      System.out.println("y1="+y1+" y2="+y2);
 }
}
运行结果如下:
y1=3 y2=4
结论:操作数在前面先赋值;操作数在后面后赋值。
自减运算符
自减运算符的用法与自增运算符完全相同,进行自减操作。下面的实例是把例2-5 中的“++ ”改为“-- ”而形成的:
public class SubOne {
       public static void main(String[] args) {
              int x1=3;
              int x2=3;
              // -- 在后面
              int y1 = x1--;
              // -- 在前面
              int y2 = --x2;
              System.out.println("y1="+y1+" y2="+y2);
       }
}
请读者自行分析程序的运行结果。
结论:操作数在前面先赋值;操作数在后面后赋值。
比较运算符
比较(关系)运算符用于对两个值进行比较,其返回值为布尔类型。
关系运算符有:> >= < <= == != ,分别表示大于、大于等于、小于、小于等于、等于、不等于。
基本用法
 exp1 X ex2
其中,exp1 exp2 是两个操作数,可以是表达式,X 表示其中的一种关系运算符,如果exp1 exp2 具有“X ”关系,结果为true ,否则结果为false 。例如5>3 ,结果为true 4!=6 结果为true
【例6
// CompareOperator.java
public class CompareOperator {
 public static void main(String[] args) {
      int a = 3;
      int b = 4;
      boolean bigger = a>b;
      boolean less = a<b;
      boolean biggerEqual = a>=b;
      boolean lessEqual = a<=b;
      boolean equal = a==b;
      boolean notEqual = a!=b;
      System.out.println("a="+a+" b="+b);
      System.out.println("a>b:"+bigger);
      System.out.println("a<b:"+less);
      System.out.println("a>=b:"+biggerEqual);
      System.out.println("a<=b:"+lessEqual);
      System.out.println("a==b:"+equal);
      System.out.println("a!=b:"+notEqual);
 }
}
运行结果如下:
a=3 b=4
a>b:false
a<b:true
a>=b:false
a<=b:true
a==b:false
a!=b:true
【注意】
①这些符号都是英文的,不能使用中文。
②“ == ”与“ = ”容易混淆,比较相等不能写成“ =
逻辑运算符
Java 中,逻辑运算符只能对布尔类型数据进行操作,其返回值同样为布尔类型的值。
逻辑运算符有:&& || ! | & ^
运算规则如下:
     && ”和“& ”是逻辑与,只有当两个操作数都为true 的时候,结果才为true
     || ”和“| ”是逻辑或,只有当两个操作数都为false 的时候,结果才为false
     ! ”是逻辑非,如果操作数为false ,结果为true ,如果操作数为true ,结果为false
     ^ ”是逻辑异或,如果两个操作数不同,结果为true ,如果两个操作数相同,结果为false
【例7
// LogicOperator.java
public class LogicOperator {
 public static void main(String[] args) {
      // 定义布尔类型的变量b1b2,并分别赋值
      boolean b1 = true;
      boolean b2 = false;
     
      // 进行各种布尔运行,并输出结果
      System.out.println("b1="+b1+" b2="+b2);
      System.out.println("b1&&b2="+(b1&&b2));
      System.out.println("b1&b2="+(b1&b2));
      System.out.println("b1||b2="+(b1||b2));
      System.out.println("b1|b2="+(b1|b2));
      System.out.println("!b1="+(!b1));
      System.out.println("b1^b2="+(b1^b2));
 }
}
运行结果为
b1=true b2=false
b1&&b2=false
b1&b2=false
b1||b2=true
b1|b2=true
!b1=false
b1^b2=true
&& ”和“& ”从运行结果来看是相同的,但是运行的过程不一样。看下面的例子:
【例8
// FastLogicOperator.java
public class FastLogicOperator {
 public static void main(String[] args) {
      int a = 5 ;
      int b = 6;
      int c = 6;
     
      // &&进行逻辑运算
      System.out.println((a>b) && (a>(b--)) );
      // 使用&进行逻辑运算
      System.out.println((a>c) & (a>(c--)) );
     
      System.out.println("b="+b);
      System.out.println("c="+c);
 }
}
运行结果为:
false
false
b=6
c=5
从这个结果可以看出,“&& ”和“& ”的运算结果相同,但是b c 的值不同。使用“&& ”的时候,后面的表达式没有计算,所以b 的值没有发生变化;使用“& ”的时候,后面的表达式进行计算了,所以c 的值发生了变化。而实际上,进行与运算只要前面的表达式是false ,结果就是false ,所以后面就不用计算了,“&& ”运算符正是使用了这个特性。
|| ”和“| ”的区别也是这样。
结论:“&& ”和“|| ”是快速运算符,但是不能保证后面的表达式执行。
位运算符
计算机中数字都是以二进制的形式存储的,位运算符用来对二进制数位进行逻辑运算,操作数只能为整型或字符型数据,结果也是整型数。
位运算符有:& | ~ ^ ,分别表示按位与、按位或、按位非和按位异或。
对两个操作数的每位进行单独的运算,把运算后的每一位重新组合成数字。
例:15&3
15 表示成二进制为:
0000 0000 0000 1111
3 表示成二进制为:
0000 0000 0000 0011
进行按位与,得到:
0000 0000 0000 0011
结果就是3
下面的例子包含了4 个位运算附。
【例9
// BitOperator.java
public class BitOperator {
 public static void main(String[] args) {
      int a = 15;
      int b = 3;
      // 按位与并输出结果
      System.out.println("a&b="+(a&b));
      // 按位或并输出结果
      System.out.println("a|b="+(a|b));
      // 按位进行异或,并输出结果
      System.out.println("a^b="+(a^b));
      // 按位取反并输出结果
      System.out.println("!a="+(~a));
 }
}
运行结果如下:
a&b=3
a|b=15
a^b=12
!a=-16
移位运算符
移位运算符同样是对二进制位进行操作。
移位运算符有3 个:
<<                  左移
>>                  右移
>>>                无符号右移
     左移
基本格式:
x<<y
其中x 是要移位的数,y 是要移动的位数。
结果相当于x 乘于2 y 次方,例如5<<2 相当于5*2 2 ,结果为20
     右移
基本格式:
x>>y
其中x 是要移位的数,y 是要移动的位数。移位之后,如果是整数,高位补0 ,如果是负数,高位补1
结果相当于x 除于2 y 次方,例如5>>2 相当于5/2 2 ,结果为1
     无符号右移
基本格式:
x>>>y
其中x 是要移位的数,y 是要移动的位数。移位之后,高位补0
所以,如果是正数,结果与有符号右移的结果相同。
如果是负数,移位之后会变成整数,因为高位补0 ,高位0 就是正数。
     例子
【例10
      int a,b,c;
      a = 15;
      b = -15;
      c = 2;
      System.out.println("----------左移运算符-----------");
      System.out.println("a="+a+" b="+b+" c="+c);
      System.out.println("a<<c= "+(a<<c));
      System.out.println("b<<c= "+(b<<c));
     
      a = 15;
      b = -15;
      System.out.println("----------右移运算符-----------");
      System.out.println("a="+a+" b="+b+" c="+c);
      System.out.println("a>>c= "+(a>>c));
      System.out.println("b>>c= "+(b>>c));
     
      a = 15;
      b = -15;
      System.out.println("----------无符号右移运算符-----------");
      System.out.println("a="+a+" b="+b+" c="+c);
      System.out.println("a>>>c= "+(a>>>c));
      System.out.println("b>>>c= "+(b>>>c));
运行结果为:
----------左移运算符-----------
a=15 b=-15 c=2
a<<c= 60
b<<c= -60
----------右移运算符-----------
a=15 b=-15 c=2
a>>c= 3
b>>c= -4
----------无符号右移运算符-----------
a=15 b=-15 c=2
a>>>c= 3
b>>>c= 1073741820
【注意】
     无符号右移的结果都是正数,不管操作数是正数还是负数。
     左移和右移,对于正数和负数移位的结果可能是不相同的,符号不变。示例中15 右移2 位得到的结果是3 -15 右移2 位得到的结果为-4 ,这样的结果与正数和负数在计算机中表示的方式相关。
条件运算符
根据不同的逻辑结果,可以得到不同的值。
基本格式
op1?op2:op3;
op1 的结果应该为布尔类型,如果op1 的值为true ,则表达式最终的结果为op2 ,如果op1 的值为false ,则表达式最后的结果是op3
【例11 】下面的代码完成了求a b 的最大值的功能。
// TernaryOperator.java
public class TernaryOperator {
 public static void main(String[] args) {
      int a=10;
      int b=7;
      int c;
     
      // 如果a>b,把a赋值给c,如果不是a>b,把b赋值给c
      c = a>b?a:b;
      System.out.println(a+""+b+"的最大值为:"+c);
 }
}
运行结果为
107的最大值为10
字符串连接运算符
+ ”,用于连接字符串,实际上在前面的例子中已经使用了。
基本格式:
op1+op2
要求op1 op2 中至少要有1 个是字符串,另外一个可以是各种类型,包括前面介绍的8 种基本数据类型以及各种类的对象。
【例12
// StringJoin.java
public class StringJoin {
 public static void main(String[] args) {
      byte b = 3;
      short s = 4;
      int i=10;
      long l = 11;
      float f = 3f;
      double d2 = 23.5;
      char c = 's';
      boolean bool = false;
      java.util.Date d = new java.util.Date();
     
      // 使用字符串与各种类型的数据进行连接
      System.out.println("byte类型:"+b);     
      System.out.println("short类型:"+s);    
      System.out.println("int类型:"+i);      
      System.out.println("long类型:"+l);     
      System.out.println("float类型:"+f);    
      System.out.println("double类型:"+d2);      
      System.out.println("char类型:"+c);     
      System.out.println("boolean类型:"+bool);
      System.out.println("其他类的对象:"+d);
 }
}
运行结果为
byte类型:3
short类型:4
int类型:10
long类型:11
float类型:3.0
double类型:23.5
char类型:s
boolean类型:false
其他类的对象Sun Dec 10 09:19:34 CST 2006
 
 
李绪成 CSDN Blog http://blog.csdn.net/javaeeteacher
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值