操作符

来源:互联网 发布:梦幻西游手游抓鬼软件 编辑:程序博客网 时间:2024/06/10 09:08
 

既然已经学习了如何声明和初始化变量,或许你希望了解如何对变量进行某种操作。从Java编程语言的操作符开始学习是个好主意。操作符是特定的符号,可以使用它们对一个、两个或者三个操作数(operand)进行特定操作,然后返回结果。

在学习Java编程语言的操作符之前,首先了解哪些操作符具有最高优先级是有帮助的。表3-2中的操作符是按照它们的优先级顺序列出的。操作符出现的位置越靠近表的顶部,其优先级就越高。优先级高的操作符先于优先级相对低的操作符进行计算。位于同一行的操作符具有相同优先级。优先级相同的操作符出现在同一表达式中时,必须给出规则,从而确定先计算哪个操作符。除赋值操作符之外,所有二元操作符都按照从左到右的顺序计算;赋值操作符按照从右到左的顺序计算。

表3-2  操作符优先级

操作符

优先级

后缀

expr++ expr--

一元

++expr --expr +expr -expr ~ !

* / %

(续)

操作符

优先级

+ -

移位

<< >> >>>

关系

< > <= >= instanceof

相等

== !=

按位与

&

按位异或

^

按位或

|

逻辑与

&&

逻辑或

||

三元

? :

赋值

= += -= *= /= %= &= ^= |= <<= >>= >>>=

在通用编程中,某些操作符出现的频率高于其他操作符;例如,赋值操作符“=”要比无符号右移位操作符“>>>”常见得多。了解这些之后,下面的讨论首先介绍最常用的操作符,然后介绍不怎么常见的操作符。后面的讨论都带有示例代码,你可以编译并运行它们。分析代码的输出能帮助你强化学到的知识。

3.2.1  赋值、算术和一元操作符

1. 简单的赋值操作符

你将用到的最常见的操作符之一是简单的赋值操作符“=”。在Bicycle类中已经见过了这个操作符;它把其右侧操作数的值赋给左侧操作数:

int cadence = 0;

int speed = 0;

int gear = 1;

也可以对对象使用这个操作符,进行对象引用(object reference)的赋值,这将在第8章中讨论。

2. 算术操作符

Java编程语言提供执行加法、减法、乘法和除法操作的操作符。在基本数学运算中能经常看到它们。你感觉陌生的唯一符号可能是“%”,它用一个操作数除另一个操作数,然后返回结果的余数。

+    加法操作符(也用于拼接字符串)

-    减法操作符

*    乘法操作符

/    除法操作符

%    取模操作符

下面的程序ArithmeticDemo测试算术操作符。

class ArithmeticDemo {

  public static void main (String[] args){

    int result = 1 + 2; // result is now 3

    System.out.println(result);

 

    result = result - 1; // result is now 2

    System.out.println(result);

    result = result * 2; // result is now 4

    System.out.println(result);

    result = result / 2; // result is now 2

    System.out.println(result);

    result = result + 8; // result is now 10

    result = result % 7; // result is now 3

    System.out.println(result);

  }

}

也可以把算术操作符和简单的赋值操作符组合在一起,从而创建复合赋值(compound assignment)。例如,x+=1;和x=x+1;都表示x的值加1。

“+”操作符也可以用于把两个字符串串联(连接)在一起,如下面的程序ConcatDemo所示:

class ConcatDemo {

  public static void main(String[] args){

    String firstString = "This is";

    String secondString = " a concatenated string.";

    String thirdString = firstString+secondString;

    System.out.println(thirdString);

  }

}

在程序的结尾,变量thirdString包含“This is a concatenated string.”,它被发送到标准输出。

3. 一元操作符

一元操作符只需要一个操作数;它们执行各种操作,比如使值递增/递减1、反转表达式或者对布尔值求反。

+     一元正操作符,指示正值(但不带这个操作符的数也是正的)

-     一元负操作符,对表达式求反

++     递增操作符,使值增加1

--    递减操作符,使值减去1

!     逻辑求补操作符,反转布尔值

下面的程序UnaryDemo测试一元操作符:

class UnaryDemo {

  public static void main(String[] args){

    int result = +1; // result is now 1

    System.out.println(result);

    result--; // result is now 0

    System.out.println(result);

    result++; // result is now 1

    System.out.println(result);

    result = -result; // result is now -1

    System.out.println(result);

    boolean success = false;

    System.out.println(success); // false

    System.out.println(!success); // true

  }

}

递增/递减操作符可以在操作数之前(前缀)或者之后(后缀)使用。代码result++;和++result;都将使result加1。唯一的区别在于,前缀版本(++result)对增加后的值进行计算;而后缀版本(result++)对原始值进行计算。如果你仅仅执行简单的递增/递减操作,那么选择哪个版本就没什么关系。但是如果使用这个操作符作为更大的表达式的一部分,那么选择不同版本就会造成很大区别。

下面的程序PrePostDemo演示前缀/后缀版本的一元递增操作符:

class PrePostDemo {

  public static void main(String[] args){

    int i = 3;

    i++;

    System.out.println(i);   // "4"

    ++i;

    System.out.println(i);   // "5"

    System.out.println(++i); // "6"

    System.out.println(i++); // "6"

    System.out.println(i);   // "7"

  }

}

3.2.2  相等、关系和条件操作符

1. 相等和关系操作符

相等和关系操作符判断一个操作数是否大于、小于、等于或者不等于另一个操作数。你可能熟悉大多数这类操作符。但要牢记,在检测两个原始值是否相等时,必须使用“==”,而不是“=”。

==    等于

!=    不等于

>     大于

>=    大于或等于

<     小于

<=    小于或等于

下面的程序ComparisonDemo测试比较操作符:

class ComparisonDemo {

  public static void main(String[] args) {

    int value1 = 1;

    int value2 = 2;

    if(value1 == value2)

                           System.out.println("value1 == value2");

    if(value1 != value2)

                           System.out.println("value1 != value2");

    if(value1 > value2) System.out.println("value1 > value2");

    if(value1 < value2) System.out.println("value1 < value2");

    if(value1 <= value2)

                       System.out.println("value1 <= value2");

  }

}

输出:

 

value1 != value2

value1 < value2

value1 <= value2

2. 条件操作符

“&&”和“||”操作符对两个布尔表达式执行条件与(Conditional-AND)和条件或(Conditional-OR)操作。这两个操作符具有“短路”行为,也就是说只在必要时才计算第二个操作数。

&&   条件与

||   条件或

下面的程序ConditionalDemo1测试这两个操作符:

class ConditionalDemo1 {

  public static void main(String[] args){

    int value1 = 1;

    int value2 = 2;

    if((value1 == 1) && (value2 == 2))

      System.out.println("value1 is 1 AND value2 is 2");

    if((value1 == 1) || (value2 == 1))

      System.out.println("value1 is 1 OR value2 is 1");

  }

}

另一个条件操作符是?:,可以把它看作if-then-else语句(在3.4节中讨论)的简写方式。这个操作符被称为三元操作符(ternary operator),因为它使用三个操作数。在下面的示例中,应该把这个操作符读作:“如果someCondition为true,就把value1的值赋给result。否则,把value2的值赋给result”。

下面的程序ConditionalDemo2测试?:操作符:

class ConditionalDemo2 {

  public static void main(String[] args){

    int value1 = 1;

    int value2 = 2;

    int result;

    boolean someCondition = true;

    result = someCondition ? value1 : value2;

    System.out.println(result);

  }

}

因为someCondition为true,所以程序把“1”输出到屏幕。如果能使代码的可读性更强,就使用?:操作符,而不使用if-then-else语句;例如,当表达式紧凑并且没有副作用(比如赋值)时。

3. 类型比较操作符instanceof

instanceof操作符把对象和指定的类型进行比较。你可以使用它测试某个对象是否是一个类的实例、子类的实例或者实现特定接口的类的实例。

下面的程序InstanceofDemo定义了父类(名为Parent)、简单接口(名为MyInterface)和子类(名为Child),子类Child继承父类并且实现接口。

 

class InstanceofDemo {

  public static void main(String args[]) {

    Parent obj1 = new Parent();

    Parent obj2 = new Child();

    System.out.println("obj1 instanceof Parent: " +

                              (obj1 instanceof Parent));

    System.out.println("obj1 instanceof Child: " +

                             (obj1 instanceof Child));

    System.out.println("obj1 instanceof MyInterface: " +

                             (obj1 instanceof MyInterface));

    System.out.println("obj2 instanceof Parent: " +

                             (obj2 instanceof Parent));

    System.out.println("obj2 instanceof Child: " +

                             (obj2 instanceof Child));

    System.out.println("obj2 instanceof MyInterface: " +

                             (obj2 instanceof MyInterface));

  }

}

class Parent{}

class Child extends Parent implements MyInterface{}

interface MyInterface{}

这个程序的输出为:

obj1 instanceof Parent: true

obj1 instanceof Child: false

obj1 instanceof MyInterface: false

obj2 instanceof Parent: true

obj2 instanceof Child: true

obj2 instanceof MyInterface: true

使用instanceof操作符时,要牢记null不是任何对象的实例。

3.2.3  位操作符和移位操作符

Java编程语言还针对整数类型提供了位操作符和移位操作符。这一节中讨论的操作符不怎么常见。因此这里只简要地介绍它们,目的是让你知道有这些操作符。

一元位求补操作符“~”反转位模式;它可以应用于任何整数类型,把每个“0”转换成“1”,把每个“1”转换成“0”。例如,一个byte包含8位,使用这个操作符处理位模式为“00000000”的值时,将把它的位模式转换为“11111111”。

带符号左移位操作符“<<”把位模式向左移位,带符号右移位操作符“>>”把位模式向右移位。位模式由左侧操作数给定,移位的位置数量由右侧操作数给定。无符号右移位操作符“>>>”把0移位到最左侧的位置,而“>>”操作之后最左侧位置的状态取决于符号扩展。

位&操作符执行位与操作。

位^操作符执行位异或操作。

位|操作符执行位或操作。

对于前面的&,当两个操作数的某位都为1时,结果中的这一位就为1。

对于前面的|,当一个操作数的某位为1时,结果中的这一位就为1。

下面的程序BitDemo使用位与操作符把数字“2”输出到标准输出。

 

class BitDemo {

  public static void main(String[] args) {

    int bitmask = 0x000F;

    int val = 0x2222;

    System.out.println(val & bitmask); // prints "2"

  }

}

3.2.4  操作符小结

下面是Java编程语言支持的操作符的参考小结。

简单赋值操作符

=        简单赋值操作符

算术操作符

+        加法操作符(也用于拼接字符串)

-        减法操作符

*        乘法操作符

/        除法操作符

%        取模操作符

一元操作符

+        一元正操作符;指示正值(但不带这个操作符的数也是正的)

-        一元负操作符;对表达式求反

++      递增操作符;使值增加1

--      递减操作符;使值减去1

!        逻辑求补操作符;反转布尔值

相等和关系操作符

==      等于

!=      不等于

>        大于

>=      大于或等于

<        小于

<=      小于或等于

条件操作符

&&      条件与

||     条件或

?:     三元(if-then-else语句的简写方式)

类型比较操作符instanceof

instanceof把对象和指定的类型进行比较

位和位移位操作符

~      一元位求补

<<     带符号左移位

>>     带符号右移位

>>>   无符号右移位

&      位与

^      位异或

|     位或

问题和练习:操作符

问题

1.   查看下面的代码段。

arrayOfInts[j] > arrayOfInts[j+1]

代码中包含哪些操作符?

2.   查看下面的代码段。

int i = 10;

int n = i++%5;

a. 执行代码后,i和n的值是什么?

b. 不使用后缀递增操作符(i++),而是使用前缀版本(++i),这时i和n的最终值是什么?

3.   为了反转布尔值,应该使用哪个操作符?

4.   比较两个值时应该使用哪个操作符?“=”还是“==”?

5.   解释下面的代码示例:

result = someCondition ? value1 : value2;

练习

1.   把下面的程序改为使用复合赋值:

class ArithmeticDemo {

  public static void main (String[] args){

    int result = 1 + 2; // result is now 3

    System.out.println(result);

    result = result - 1; // result is now 2

    System.out.println(result);

    result = result * 2; // result is now 4

    System.out.println(result);

    result = result / 2; // result is now 2

    System.out.println(result);

    result = result + 8; // result is now 10

    result = result % 7; // result is now 3

    System.out.println(result);

  }

}

2.   在下面的程序中,解释为什么“6”这个值在输出中出现了两次:

class PrePostDemo {

  public static void main(String[] args){

    int i = 3;

    i++;

    System.out.println(i);     // "4"

    ++i;

    System.out.println(i);     // "5"

    System.out.println(++i);  // "6"

    System.out.println(i++); // "6"

    System.out.println(i);     // "7"

  }

}

答案

可以在以下位置找到“问题”和“练习”的答案:

       

tutorial/java/nutsandbolts/QandE/questions_expressions.html