一个人至少拥有一个梦想,有一个理由去坚强

心若没有栖息的地方,到哪里都是在流浪

java编程思想——第三章操作符

借鉴博客园的一篇文章,总结很好,直接复制下来。加入一些总结不到的内容。

在最低层,java中的数据都是通过使用操作符来操作的。

操作符接收一个或多个参数,作用于操作数,并生成一个新值。

算数操作符

Java的算数操作符与其它大多数程序设计语言都是相同的,其中包括加号(+)减号(-)乘号(×)除号(÷)以及取模(%)整数的除法将会去掉小数位而不是四舍五入。一个算数操作符的演示:

public static void main(String[] args) {
    int a, b, result;
    a = 37;
    b = 13;
    result = a + b;
    System.out.println("a + b : " + result);
    result = a - b;
    System.out.println("a - b : " - result);
    result = a * b;
    System.out.println("a * b : " * result);
    result = a / b;
    System.out.println("a / b : " / result);
    result = a % b;
    System.out.println("a % b : " % result);
}
a + b : 50
a - b : 24
a * b : 481
a / b : 2
a % b : 11

注意:此例中对String的操作还包含了+操作符,在此时的+的作用是字符串拼接,如果此时后面跟随的是非String类型的元素时,编译器会尝试将其转换为String

Java还提供了2个方便的快捷运算:自动递增(++)自动递减(--)。举个例子而言,a++就相当于a = a + 1a--则相当于a = a - 1。这两个操作符有两种使用方式,分别为前缀式后缀式。前缀式会先执行计算再赋值,而后缀式则会先进行赋值再执行运算。下面是一个例子:

public static void main(String[] args) {
    int i = 1
    System.out.println("i : " + i);
    System.out.println("++i : " + ++i);
    System.out.println("i++ : " + i++);
    System.out.println("i : " + i);
    System.out.println("--i : " + --i);
    System.out.println("i-- : " + i--);
    System.out.println("i : " + i);
}

其输出结果为:

i : 1
++i : 2
i++ : 2
i : 3
--i : 2
i-- : 2
i : 1

优先级:最简单的规则是先乘除后加减,避免出错,应该用括号明确规定计算顺序。

赋值操作符


Java的赋值除了=外,还有与各个算术运算符结合组成的赋值运算符(+=,-=,*=,/=,%=),其作用是对左右进行运算后将结果赋值给左边的变量。一个简单的例子:

public static void main(String[] args] {
    int x , y;
    x = 22;
    y = 14;
    x += y;
    System.out.println("x += y : " + x);
    x -= y;
    System.out.println("x += y : " + x);
    x *= y;
    System.out.println("x *= y : " + x);
    x /= y;
    System.out.println("x /= y : " + x);
    x %= y;
    System.out.println("x %= y : " + x);
}

其输出结果为:

x += y : 36
x -= y : 22
x *= y : 308
x /= y : 22
x %= y : 8

下面详细介绍操作符:=

它的意思是“ 取右边的值,把它复制给左边”。右值可以是任何常数、变量或者表达式(只要它生成一个值就行)。但是左值必须是一个明确的已命名的变量。也就是说,必须有一个物理空间可以存储等号右边的值。

对基本类型的赋值很简单。基本类型存储了实际的数值,而并非指向 一个对象的引用,所以在为其赋值的时候,是直接将一个地方的内容复制到了另一个地方。例如对基本类型使用a=b,那么b的内容就复制给了a。若接着修改a,b不会受影响。

但是在为对象赋值 的时候,情况却不一样。对一个对象进行操作的时候,我们正真操作的是对象的引用。所以倘如将“一个对象赋值给另一个对象”,实际上是将“引用”从一个地方复制到另一个地方。若对对象使用: c=d,那么cd都指向原来只有d指向的那个对象。请看下面的例子:

Class Dog {
   int tail;
}
public class example {
   public static void main(String[] args) {

      Dog d1 = new Dog();
      Dog d2 = new Dog();
      
      d1.tail = 10;
      d2.tail = 15;
      
      print("1:d1.tail: " + d1.tail  + 
             ", d2.tail:" + d2.tail );

       d1 = d2;
 
       print("2:d1.tail: " + d1.tail + 
             ", d2.tail:" + d2.tail );

       d1.tail = 30;

       print("2:d1.tail: " + d1.tail + 
              ", d2.tail:" + d2.tail );
    
   }

}

/** Output:
  1: d1.tail:10, d2.tail:15
  2: d1.tail:15, d2.tail:15
  3: d1.tail:30, d2.tail:30
**/

上例可见,修改d1的同时也改变了d2.这是因为d1和d2包含的是相同的引用,它们指向相同的对象。(再被引用的对象会由java的垃圾回收器自动清理)

这种特殊的现象通常称作“别名现象”,是java操作对象的一种基本方式。

比较操作符


比较操作符生成的是一个布尔值(boolean)结果,它们计算的是操作数之间的关系。如果关系成立则返回true,否则返回false。比较操作符包括小于(<)大于(>)小于或等于(<=)大于或等于(>=)等于(==)以及不等于(!=)

注意:测试对象的等价性时一般不使用==,而是使用覆盖了父类的方法Object.equals(Object obj)判断。

短路

&&||是两个特殊的比较操作符,当使用短路与(&&)操作符时,如果第一个条件为false则之后的判断都不会执行而直接跳过;而当使用短路或(||)操作符时,如果第一个条件为true则不会检查后面的部分的真假而直接返回true。简而言之,短路就是一旦能够明确无误地确定整个表达式的值,就不会再计算表达式剩余的部分了。下面是一个例子:

public static void main(String[] args) {
    boolean b = test1(0) && test2(2) && test3(2);
    System.out.println("expression is " + b);
}

static boolean test1(int val) {
    System.out.println("test1(" + val + ")");
    System.out.println("result: " + (val < 1));
    return val < 1;
}

static boolean test2(int val) {
    System.out.println("test1(" + val + ")");
    System.out.println("result: " + (val < 2));
    return val < 2;
}

static boolean test3(int val) {
    System.out.println("test1(" + val + ")");
    System.out.println("result: " + (val < 3));
    return val < 3;
}

其输出结果为:

test1(0)
result : true
test2(2)
result : false
expression is false

位操作符


Java中的位操作符用来操作整数基本数据类型中的单个比特(bit),即二进制位。位操作符包括位与(&)或(|)异或(^)非(!)左移位(<<)右移位(>>)无符号右移(>>>)。在位运算中,1被视为true,而0被视为false

public static void main(String[] args) {

    // 1、位与(&)
    // 位与:第一个操作数的的第n位于第二个操作数的第n位如果都是1,那么结果的第n为也为1,否则为0
    System.out.println(5 & 3);// 结果为1
    System.out.println(4 & 1);// 结果为0

    // 2、位或(|)
    // 第一个操作数的的第n位于第二个操作数的第n位 只要有一个是1,那么结果的第n为也为1,否则为0
    System.out.println(5 | 3);// 结果为7

    // 3、位异或(^)
    // 第一个操作数的的第n位于第二个操作数的第n位 相反,那么结果的第n为也为1,否则为0
     System.out.println(5 ^ 3);//结果为6

    // 4、位非(~)
    // 操作数的第n位为1,那么结果的第n位为0,反之。
    System.out.println(~5);// 结果为-6

    // 5、左移(<<)
    // 0000 0000 0000 0000 0000 0000 0000 0101 然后左移2位后,低位补0
    // 0000 0000 0000 0000 0000 0000 0001 0100 换算成10进制为20
    System.out.println(5 << 2);// 运行结果是20

    // 6、右移(>>) 高位补符号位
    // 0000 0000 0000 0000 0000 0000 0000 0101 然后右移2位,高位补0:
    // 0000 0000 0000 0000 0000 0000 0000 0001
    System.out.println(5 >> 2);// 运行结果是1

    // 7、无符号右移(>>>) 高位补0
    // 例如 -5换算成二进制后为:0101 取反加1为1011
    // 1111 1111 1111 1111 1111 1111 1111 1011
    // 我们分别对5进行右移3位、 -5进行右移3位和无符号右移3位:
    System.out.println(5 >> 3);// 结果是0
    System.out.println(-5 >> 3);// 结果是-1
    System.out.println(-5 >>> 3);// 结果是536870911
}

三元操作符


三元操作符也被称为条件操作符,它有三个参数,且会在计算之后获得一个值。其格式为boolean-exp ? value0 : value1。当boolean-exp(布尔表达式)的结果为true,就返回value0;反之返回value1

public static void main(String[] args) {
    System.out.println(1 > 0 ? "这个表达式是对的" : "这个表达式是错的");
    System.out.println(1 < 0 ? "这个表达式是对的" : "这个表达式是错的");
}

其输出结果为:

这个表达式是对的
这个表达式是错的


注意:三元操作符虽然比if-else语句看起来简洁显得紧凑,但若频繁使用,会产生可读性差的代码。

优先级


当一个表达式中存在多个操作符时,操作符的优先级就决定了各部分的运算顺序。Java对运算顺序做了特别的规定(最简单的就是先乘除后加减),而程序员经常会忘记一些运算顺序,所以应该用括号明确规定运算顺序

public static void main(String[] args) {
    int x = 1, y = 2, z = 3;
    int a = x + y - 2 / 2 + z;
    int b = x + (y - 2) / (2 + z);
    System.out.println("a = " + a + " b = " + b);
}

其输出结果为:

a = 5 b = 1
点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注