第3章 运算符
1815
2012-6-20

第三章 Java中的运算符

一、     

在Java编程过程中,运算符主要包括如下几种。

算术运算符:+ 、 - 、 * 、 / 、 % 、 ++ 、 --。

赋值运算符:= 、 += 、 -= 、 *= 、 /= 、 %=。

关系运算符:> 、 < 、 >= 、 <= 、 == 、 !=。

逻辑运算符:! 、 & 、 | 、 ^ 、 && 、 ||。

位运算符:& 、 | 、 ^ 、 ~ 、 >> 、 << 、 >>>。

字符串连接运算符:+。

1.1  算术运算符

算术运算符主要用来进行算术计算。常用的算术运算符如表3.3所示。

表1.3  常用的算数运算符

运 算 符

描  述

示  例

结  果

 +

       加

5+5

10

 -

       减

5-4

 1

 *

       乘

5*3

15

 

                                                                                                                                                                  续表

运 算 符

描  述

示  例

结  果

 /

       除

  10/3

 3

 %

       取模(求余)

10%3

 1

++

       自增(前,后)

 

 

--

       自减(前,后)

 

 

 

在表1.3中,++和--是初学者最不容易理解的两个算符运算符,一般++如果是前缀,那么先对此变量加1,再执行其他的操作;如果是后缀,则先执行其他的操作,再对此变量加1,--的作用同理。如下面ArithmeticOperatorsTest程序的代码:

public class ArithmeticOperatorsTest{

    /**

     * @param 算术运算符号+ - * / %   ++  --

     */

    public static void main(String[] args) {

        int a=9;

        int b=5;

        int c=a+b;

        System.out.println("和为:"+c);

        int d=a-b;

        System.out.println("减为:"+d);

        int e=a*b;

        System.out.println("乘为:"+e);

        int f=a/b;

        System.out.println("除为:"+f);

        int g=a%b;

        System.out.println("取余数为:"+g);     

        //++演示

        //如果是前缀:先对此变量加1,再执行其他的操作:可以是计算、赋值、输出

        //int h=++a+b;//1.a=a+1; 2.h=a+b;

        //System.out.println("前缀"+h);

        //如果是后缀:先执行其他的操作,再对此变量加1

        //int i=a+b++;//1.i=a+b 2.b=b+1;

        int i=a+++b;//1.i=a+b 2.a=a+1;

        System.out.println("后缀"+i);

        System.out.println("b:"+a);

    }

}

输出结果为:

和为:14

减为:4

乘为:45

除为:1

取余数为:4

后缀14

b:10

单独学习自增或自减比较容易,下面通过一个结合例子来深入学习。

public class SelfTest{

   public static void main(String[ ] args) {  

       int i=7;

       System.out.println(++i+i+++i);

  }

}

该程序产生的输出结果为25。

println()方法中的表达式也即“(++i)+(i++)+i”的简写,表达式++i的值经过运算之后为8,然后i的值也递增至8,执行求和运算值为16,此时i的值再自增至9,所以最终的运算结果为25。

++和--运算符是单目运算符。优先级比算术运算符高。

小知识:使用键盘输入字符到程序的功能

在JDK 1.5以后引入了Scanner这个类,它的方法能接收控制台上输入的字符,将其转换为相应数据类型的数据,并存储到指定的变量中。要从键盘输入信息并保存需要如下几步。

第1步  在程序开头输入“import java.util.Scanner”,表示导入键盘输入功能,系统已经写好了,只需要拿到程序中使用就可以了。

第2步  在程序执行体中输入“Scanner input=new Scanner(System.in);”。

第3步  表示输入功能初始化,如果要接收一个整型的数据就要定义一个整型的变量来接收,如:“int num1=input.nextInt();”。如果是其他类型的变量,则“=input.next***();”中的***也要改成相应的类型,如“String num2=input.nextString();”、“double num3=input.nextDouble();”等。

下面来做一个上机练习。

Exe1.java程序是通过键盘输入平均成绩求总成绩,代码如下。

import java.util.Scanner;

    /**

     * 通过键盘输入平均成绩,求总成绩

     */

public class Exe1 {

    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);

        int i = 8;// 人数

        System.out.println("请您输入平均成绩");

        int avg = input.nextInt();// 输入一个平均成绩

        int sum = avg * i;// 总成绩

        System.out.println("总成绩为" + sum);

    }

}

输出结果为:

请您输入平均成绩

23

总成绩为184

一个好的编程人员是在实践中不断地成长起来的,上机练习是实践中最重要的环节。学到此处,读者可以试着编写本章的课后上机练习中变量运算符练习的各题,相信会大有收获。

1.2  赋值运算符

赋值运算符的作用是将一个值赋给一个变量,运算顺序从右到左,如表3.4所示。

表1.4  赋值运算符

运 算 符

描  述

示  例

结  果

 =

  赋值

       a=3;b=2;

a=3 b=2

+=

加等于

       a=3;b=2;a+=b;即a=a+b;

a=5 b=2

-=

减等于

       a=3;b=2;a-=b;即a=a-b;

a=1 b=2

*=

乘等于

       a=3;b=2;a*=b;

a=6 b=2

/=

除等于

       a=3;b=2;a/=b;

a=1 b=2

%=

模等于

       a=3;b=2;a%=b;

a=1 b=2

 

+=、-=、*=、/=、%=属于复合赋值运算符,它们是赋值运算符和算术运算符的复合。

【示例1】AssignmentOperatorsTest.java

下面的代码是通过键盘动态输入两个数并将所输入的两个数赋值到对应的两个变量中,然后测试一下复合赋值运算。

import java.util.Scanner;

public class AssignmentOperatorsTest {

    /**

     * 赋值运算符

     */

    public static void main(String[] args) {

        //通过键盘输入两个数

        Scanner input=new Scanner(System.in);//声明并赋初值

        System.out.println("请输入两个运算的数:");

        int a=input.nextInt();

        int b=input.nextInt();

        //对它们进行赋值运算符的计算+=,-=、...、/=

          a+=b;//a=a+b;

        //a-=b;//a=a-b;

        //a/=b;

        System.out.println("a+=b的值是:"+a);

    }

}

输出结果为:

请输入两个运算的数:

3

2

a+=b的值是:5

Scanner类是系统提供的类,只有JDK 5.0才有此功能,注意安装的环境。

【示例2】AssignmentOperatorsTest2.java

下面的代码测试复合赋值运算符的计算顺序。

public class AssignmentOperatorsTest2 {

    /**

     * 赋值运算符号=、+=、-=、*=、/=、%=

     */

    public static void main(String[] args) {

        int a=8;   //赋值运算符的运算顺序是从右到左

        int b=3;

        int c=1;

        int d=2;

        c+=1;  //   c=c+1;-----c=1+1;

        System.out.println(c);

        c+=a;  //   c=c+a;-----c=2+8;

        System.out.println(c);

        d-=b;  //   d=d-b;-----d=2-3;

        System.out.println(d);

        a%=b;  //  a=a%b;-----a=8%3;

        System.out.println(a);

    }

}

输出结果为:

2

10

-1

2

1.3  关系运算符

关系运算符的作用是比较两边的运算数,结果总是boolean型的数据。表3.5列出了常用的关系运算符。

表3.5  常用的关系运算符

运 算 符

描  述

示  例

结  果

==

       等于

       4==3

false

!=

       不等于

       4!=3

 true

       小于

       4<3

false

       大于

       4>3

 true

<=

       小于等于

       4<=3

false

>=

       大于等于

       4>=3

 true

 

在关系运算中,判定运算符两边数据之间关系的结果类型为boolean型,它只有两个值,即真和假(true和false)。

下面通过练习来看一下在关系运算中如何使用boolean类型数据。

用boolean类型数据描述:学员张三的考试成绩(88.8)是否比学员李四高。程序RelationalOperatorsTest.java的实现代码如下。

import java.util.Scanner;

    /**

     * 演示关系运算符==、>=、<=、!=、>、<

     * 关系或条件表达式计算的结果用boolean类型的变量来存储

     */

public class RelationalOperatorsTest {

    public static void main(String[] args) {

        //编程思路:

        //首先要定义一个变量来存储张三的分数

        double zhangsanfenshu=88.8;

        //要提示用户从控制台上输入李四的成绩,并存储到定义好的李四变量中

        System.out.println("请您输入李四的分数:");

        Scanner input=new Scanner(System.in);

        double lisifenshu=input.nextDouble();

        //比较张三和李四的分数将比较的结果存储到定义好的boolean类型的变量中

        boolean jieguo=zhangsanfenshu>lisifenshu;

        //条件表达式也叫关系表达式,是一个boolean类型的结果

        //然后打印输出它们比较的结果

        System.out.println("张三的分数高于李四的分数吗?"+jieguo);

       

        int a=8;

        int b=9;

        //boolean guo=a>b;

        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<=b   ?"+(a<=b));

        System.out.println("a==b   ?"+(a==b));

        System.out.println("a!=b   ?"+(a!=b));

        System.out.println("a==b   ?"+(a==b));

        //关系运算符比较两个数是否相等,结果用boolean类型的数表示

        System.out.println("a!=b   ?"+(a=b));

        //赋值运算符是从右到左赋值

        //System.out.println("a>b   ?"+guo);

        //要注意=与==的区别

    }

}

输出结果为:

请您输入李四的分数:

88

张三的分数高于李四的分数吗?true

a>b   ?false

a>=b   ?false

a<b   ?true

a<=b   ?true

a==b   ?false

a!=b   ?true

a==b   ?false

a!=b   ?9

一般boolean类型的变量主要存储的是关系表达式的结果。

1.4  逻辑运算符

逻辑运算符用于对boolean类型结果的表达式进行运算,运算结果总是boolean类型的。常用的逻辑运算符如表3.6所示。

表3.6  常用的逻辑运算符

运 算 符

描  述

示  例

结  果

&

false & true

false

|

false | true

 true

^

异或

true ^ false

 true

!

!true

false

&&

逻辑与

false && true

false

||

逻辑或

false || true

 true

 

下面通过练习来看一下在逻辑运算符中如何使用boolean类型数据。

public class LogicOperationTest{

    public static void main(String[] args){

     boolean flag1=3>2;

     boolean flag2=5<2;

    System.out.println("flag1&flag2结果为:"+(flag1&flag2));

    System.out.println("flag1|flag2结果为:"+(flag1|flag2));

    System.out.println("flag1^flag2结果为:"+(flag1^flag2));

    System.out.println("!flag2       结果为:"+(!flag2));

    System.out.println("flag1&&flag2结果为:"+(flag1&&flag2));

    System.out.println("flag1||flag2结果为:"+(flag1||flag2));

    }

}

输出结果为:

flag1&flag2结果为:false

flag1|flag2结果为:true

flag1^flag2结果为:true

!flag2       结果为:true

flag1&&flag2结果为:false

flag1||flag2结果为:true

1.5  位运算符

位运算符对两个运算数中的每一个二进制位都进行运算,位运算符分类如下。

l   按位取反 ~。

l   按位与 &。

l   按位或 |。

l   按位异或 ^。

图3.3所示为四个位运算的示例。

图3.3  位运算示例

其中~(按位取反)就是进行二进制数据取反,即0变1,1变0;&(按位与)主要是两个二进制操作数进行按位与操作时,两位都是1结果才是1,也就是两个二进制操作数如果是1&1得到的结果才为1,其他情况都为0;| (按位或)主要是两个二进制操作数如果其中一个为1结果就为1,如1 | 0 结果为1,只有两位全是0最后结果才为0;而^(按位异或)是两个二进制操作数相异,结果才为1,如1^0结果为1。一般只有计算机才去具体的进行这些二进制的计算,在编程的过程中使用的比较少。

1.6  移位运算符

Java 编程语言提供了两种右移位运算符和一种左移运算符,右移一位(>>)相对于除以2:左移(<<)相对于乘以2。移位运算一般是相对于二进制数据而言的,下面是移位运算的移动规则。

(1) 左移:“a<<b; ”将二进制形式的a逐位左移b位,最低位空出的b位补0。

128 << 1 即128*211 = 256

16<<2   即 16*22 =64

(2) 带符号右移:“a>>b; ”将二进制形式的a逐位右移b位,最高位空出的b位补原来的符号位。

128 >> 1 即128/21= 64

256 >> 4 即256/24= 16

-256 >> 4 即-256/24= -16

(3) 无符号右移:“a>>>b;”将二进制形式的a逐位右移b位,最高位空出的b位补0。

图3.4所示为十进制数2227的各种移位运算示例。

图1.4  移位运算示例

此小节不需要读者深入理解,只要对移位运算符有所了解即可。

(1):移位运算符将它们右侧的操作数模32简化为int类型左侧操作数, 模64简化为long类型右侧操作数。因而, 任何int x, x >>> 32 都会导致不变的x 值, 而不是你可能预计的零。

(2):值得称赞的重要一点是: >>>运算符仅被允许用在整数类型, 并且仅对int 和long

值有效。如果用在short或byte值上, 则在应用>>>之前, 该值将通过带符号的向上类型转换被升级为一个int。有鉴于此,无符号移位通常已成为符号移位。

下面通过程序MyTest.java来实现移位运算,看看程序输出什么结果?

public class MyTest {

    public static void main(String[] args) {

        /** 移位运算符 */

        int a = 10;

        int i = ~a;

        int j = a >>> 3;

        int k = a << 3;

        int m = a >> 2;

        System.out.println("i=" + i);

        System.out.println("j=" + j);

        System.out.println("k=" + k);

        System.out.println("m=" + m);

    }

}

输出结果为:

i=-11

j=1

k=80

m=2

1.7  其他运算符

1. 字符串连接运算符“+”

语句“String s="He" + "llo";”的执行结果为"Hello",“+”除了可用于字符串连接,还能将字符串与其他的数据类型相连成为一个新的字符串。如:“String s="x" + 123;”,结果为"x123"。

下面的程序StringConnect.java是通过“+”来连接两个或多个字符串的示例。

public class StringConnect{

    /**

     * 字符串测试

     * 凡是""括起来的数据都是字符串,当使用“+”时,表示字符串的链接

     */

    public static void main(String[] args) {

        String a="中"+"国";

        System.out.println(a);

        System.out.println("中"+a);

        String b=3+"好";

        System.out.println(b);

        String c="1"+"2";

        System.out.println(c);

    }

}

输出结果为:

中国

中中国

3好

12

2. 三目运算符?:

三目运算符就是能操作三个数的运算符,如X ? Y : Z ,X为boolean类型表达式,先计算X的值,若为true,整个三目运算的结果为表达式Y的值,否则整个运算结果为表达式Z的值。如:int score = 75; String type = score >=60 ? "及格" : "不及格";

下面的程序TernaryOperatorsTest.java就是三目运算符的应用实例。

public class TernaryOperatorsTest {

    /**

     * 三目运算符

     */

    public static void main(String[] args) {

        int a=8;

        int b=9;

        int c=a>b?a:b;

        //首先判断a是否大于b,如果 a大于b,

        //那么就将a的值作为整个三目运算的表达式的结果赋值给c

        //如果a<b那么就将b的值作为整个表达式的值赋值给c

        System.out.println(c);

        String m=b<a?"真":"假";

        System.out.println(m);

    }

}

输出结果为:

9