java入门教程 1.3 - 运算符

Java tutorial 1.3 operator

Posted by xuepro on December 17, 2022

1.3 运算符、表达式、语句、程序块 (operator, Expressions, Statements, and Blocks)

1.3.1 运算符(operator)

运算符是对运算数(变量、文字量或表达式的值)执行运算的符号。例如,+、-、*、/分别是对2个运算数进行加法、减法、乘法和除法的运算符。Java中有许多类型的运算符:

算术运算符

关系运算符
逻辑运算符
位运算符
赋值运算符
一元运算符
三元运算符

1. 算术运算符

算术运算符用于对变量和数据执行算术运算。算数运算数有5个:+、-、*、/、%。其中%是取模(求余数)运算,即 求一个数除以另外一个数的余数。如:

int x = 5 % 3;            // x = 2
double y = .5 % .3;       // y = .2

和C/C++语言不同,尽管可以对浮点数执行%运算,但通常不会这样做。

2.关系运算符

关系运算符用于检查两个运算符(操作数)之间的关系。关系运算符有:< 、> 、<= 、>=、== 、!= 、instanceof。“< 、> 、<= 、> =、== 、!=分别用于判断两个运算数是否具有“小于、大于、小于等于、大于等于、相等、不等”的关系,返回结果为true或false,表示关系的真或假。例如,

int a = 3, b = 5;
System.out.println(a < b);  // true
System.out.println(a > b);  // false
System.out.println(a >= b);  // false
System.out.println(a <= b);  // true
System.out.println(a == b);  // false
System.out.println(a != b);  // true

instanceof用于测试一个对象是否是指定类型(类或子类或接口)的实例。今后会介绍这个运算符。

3. 逻辑运算符

逻辑运算符用于检查表达式是真还是假。它们用于判断一个条件是否成立,从而做出决策。&&、   、!分别称为逻辑或、逻辑与、逻辑非。其运算规则如下表:  
  运算符 例子 含义
  && exp1 && exp2 仅当 exp1 和 expr2都为true时才为true
  || exp1 || exp2 如果 exp1 或 exp2有一个为true,则为true
  !exp 如果exp为false则为true,如果exp为true则为false

如:

class TestLogicalOperators{
  public static void main(String[] args) {
    int a = 7; 
    int b = 2
    int c = 5;

    System.out.println((a > b) && (b > c));  // false
    System.out.println((a > b) || (b > c));  // true
    System.out.println(!(a == b));  // true
    System.out.println(!(a > b));  // false
  }
}

4.按位运算符

按位运算符是对整型数(byte、short、int、long)的单个位执行操作。 Java一共有7个位运算符:~、|、&、«、»、»>,它们分别称为按位补码、位或、位与、左移、右移、无符号右移

按位补码~ 它反转运算数的每个二进制位的值(0 到 1 和 1 到 0)。如23的二进制是10111, ~23的二进制是01000,作为int类型的23除后5位外,前面的27位都是0,~23的前面27位都是1。

class TestBitwiseComplement {
    public static void main(String[] args) {
        int x = 23;
        System.out.println(x);                                 //输出23
        System.out.println(Integer.toBinaryString(x));         //输出10111

        int y  = ~x; 
        System.out.println(y);                                 //输出-24
        System.out.println(Integer.toBinaryString(y));         //输出11111111111111111111111111101000
    }
}

代码中”Integer.toBinaryString(x)”用Integer类的方法toBinaryString()将int类型的x转化为二进制字符串的形式,以输出x二进制形式。

**按位或 **:

对2个运算符按照对应的二进制位进行下面的运算:如果2个二进制位有一个为 1,则运算返回 1;否则,它返回 0。设a,b是2个二进制位其运算规则如表所示: | a | b | a|b | | — | — | — | | 0 | 0 | 0 | | 0 | 1 | 1 | | 1 | 0 | 1 | | 1 | 1 | 1 | 例如,45和27的二进制位的后6位是101101和011011,其余位都是0,则45|27的后6位是111111,其余位都是0,45|27的十进制数就是63(111111)。

class TestBitwiseOR {
    public static void main(String[] args) {
        int x = 45;        
        System.out.println(Integer.toBinaryString(x));
        int y = 27;       
        System.out.println(Integer.toBinaryString(y));
        int z  = x|y;        
        System.out.println(Integer.toBinaryString(z));
        System.out.println(z);
    }
}

按位与 &: 对2个运算符按照对应的二进制位进行下面的运算:如果2个二进制位都是 1,则运算返回 1;否则,它返回 0。设a,b是2个二进制位其运算规则如表所示: | a | b | a&b | | — | — | — | | 0 | 0 | 0 | | 0 | 1 | 0 | | 1 | 0 | 0 | | 1 | 1 | 1 |

45&27的结果是9(其二进制的最后4位是1001,其余位是0)。

按位异或 ^: 对2个运算符按照对应的二进制位进行下面的运算:如果2个二进制位都是1或都是0,则运算返回 0;否则,它返回 1。设a,b是2个二进制位其运算规则如表所示: | a | b | a^b | | — | — | — | | 0 | 0 | 0 | | 0 | 1 | 1 | | 1 | 0 | 1 | | 1 | 1 | 0 |

45^27的结果是54(其二进制的最后6位是110110,其余位是0)。

左移运算符 «: 左移运算符«将所有位向左移动指定数量的二进制位,最左边的位(最高有效位)被丢弃,最右边的位置(最低有效位)空缺,空位用0补上。如”a«2”将a的二进制都向做移动2位,右边空出的2位填补0。”a«1”将a的二进制都向做移动1位,右边空出的2位填补0。如图是左移1位的左移运算示意图:

左移1位的左移运算示意图 例如,45«2的结果是180(对应二进制位10110100)。

带符号的右移运算符 »: 右移运算符»将所有位向右移动指定数量的指定位,最低有效位(最右边)被丢弃,最高有效位(最左边)用符号位填充。

class TestSignedRightShiftTest{
    public static void main(String[] args) {
        int x = -4;        
        System.out.println(Integer.toBinaryString(x));         // 输出:11111111111111111111111111111100      
        System.out.println(Integer.toBinaryString(x>>1));      // 输出:11111111111111111111111111111110
        System.out.println(x>>1);                              // 输出:-2

        int y = 4;       
        System.out.println();
        System.out.println(Integer.toBinaryString(y));         // 输出:100
        System.out.println(Integer.toBinaryString(y>>1));      // 输出:10
        System.out.println(y>>1);                              // 输出:2
    }
}

无符号的右移运算符 »>: 和»的区别是: »>运算的最左边空出的位置用0代替符号位。

 class TestUnsignedRightShiftTest{
    public static void main(String[] args) {
        int x = -4;        
        System.out.println(Integer.toBinaryString(x));         // 输出:11111111111111111111111111111100      
        System.out.println(Integer.toBinaryString(x>>1));      // 输出:11111111111111111111111111111110
        System.out.println(x>>1);                              // 输出:-2

        int y = 4;       
        System.out.println();
        System.out.println(Integer.toBinaryString(y));         // 输出:100
        System.out.println(Integer.toBinaryString(y>>1));      // 输出:10
        System.out.println(y>>1);                              // 输出:2

        System.out.println();
        System.out.println(Integer.toBinaryString(x>>>1));     // 输出:1111111111111111111111111111110
        System.out.println(x>>>1);                             // 输出:2147483646
        System.out.println(Integer.toBinaryString(y>>>1));     // 输出:10
        System.out.println(y>>>1);                             // 输出:2
    }
}

5. 赋值运算符

赋值运算符在 Java 中用于为变量赋值。例如,

int age;
age = 15;

“age = 15”将整数15赋值给int类型变量age。赋值运算符可以和算术运算符或位运算符结合,构成复合赋值运算符。如:= += -= *= /= %= &= ^= |= <<= >>= >>>=。 对于变量a和运算数b,“a+=b”相当于“a = a+b”。其余的复合赋值运算符以此类推。

6.一元运算符 一元运算符仅对一个操作数进行运算。例如,++ 是一个一元运算符,它将变量的值增加 1。也就是说,++2 将返回 3。如下表所示,共有5个一元运算符。 |运算符|含义| 变量 | 运算 | 输出值 | | - | — | – | – | – | | + | 一元加号:没有必要使用,因为数字默认就是正数 | int a=3 | +a | 3| | - | 一元负号:反转运算数的符号 | int a=3 | -a | -3 | | ++ | 自增运算符:将值递增 1 |int a=3 | ++a | 4 | | - | 自减运算符:将值减 1 |int a=3 | –a | 2 | | ! | 逻辑补码运算符:反转布尔值 |boolean a=true | !a | false |

++放在运算符的前面,称为前缀++,如++a。也可以放在运算符的后面,称为后缀++。如a++。

a = 2
++a;          // a becomes 3
a++;          // a becomes 4
--a;          // a becomes 3
a--;          // a becomes 2

前缀和后缀有一个重要的区别,就是表达式的结果是不一样的。

  • 如果使用 ++ 运算符作为前缀,如:++a,则 a 的值递增 1;然后返回这个递增后的a的值。
  • 如果使用 ++ 运算符作为后缀,如:a++,则首先返回a的原始值;然后 a 增加 1。
class TestPrefixPostfix {
    public static void main(String[] args) {
        int a = 2;
        int  b =++a;
        System.out.println(a);        // 输出: 3
        System.out.println(b);        // 输出: 3
        a=2;
        b = a++;
        System.out.println(a);        // 输出: 3 
        System.out.println(b);       // 输出: 2
    }
}

7.条件运算符 ?: 三元运算符(条件运算符)?: 是 条件语句if-then-else (条件语句将在语句一节内介绍)的简写。格式为: Expression ? expression1 : expression2 其含义是:当Expression为true或非零值时,该表达式的结果为expression1,否则,结果为expression2。

float score = 70.5f;
string result = score>=60? "you passed!":"you failed!";
System.out.println(result);               // 输出: you passed!

支付宝打赏 微信打赏

您的打赏是对我最大的鼓励!