8. Java 中的运算符 【连载 8】

从零开始学Java封面8.jpg

在前面的内容已经学会了如何定义变量和初始化变量。定义变量的目的就是为了操作数据。Java 语言中给我们提供了专门用来操作这些数据的代码符号,统称为“运算符”。

按照操作符的用法,我们可以分为以下几类:

  • 算术运算符
  • 赋值运算符
  • 自增和自减运算符
  • 逻辑运算符
  • 关系运算符
  • 位运算符

不用担心,它们就是些符号而已,帮我们处理操作数据的。下面用代码实例,一一来说明这些运算符的用法。

1. 算术运算符

算术运算符,就是针对数值变量的加、减、乘、除、取余的算术操作:

  • 加 :+
  • 减:-
  • 乘:*
  • 除:/
  • 取余:%
public class OperatorsDemo {

    public static void main(String[] args) {
        int num1 = 100;
        int num2 = 20;
        //加
        System.out.println("num1 + num2: " + (num1 + num2) );
        //减
        System.out.println("num1 - num2: " + (num1 - num2) );
        //乘
        System.out.println("num1 * num2: " + (num1 * num2) );
        //除
        System.out.println("num1 / num2: " + (num1 / num2) );
        //取余
        System.out.println("num1 % num2: " + (num1 % num2) );
    }
}

输出结果:

num1 + num2: 120
num1 - num2: 80
num1 * num2: 2000
num1 / num2: 5
num1 % num2: 0

2. 赋值运算符

与大部分编程语言相同,Java使用'='运算符来进行赋值操作。这种操作会将右边的计算结果(称为右值)赋给左边的变量。Java 中赋值运算符有:

  • =num2 = num1
  • +=num2 += num1 等价 num2 = num2 + num1)
  • -=num2 -= num1 等价 num2 = num2 - num1)
  • *=num2 *= num1 等价 num2 = num2 * num1)
  • /=num2 /= num1 等价 num2 = num2 / num1)
  • %=num2 %= num1 等价 num2 = num2 % num1)
public class OperatorsDemo {

    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 20;

        num2 = num1;
        System.out.println("= Output: "+num2);

        num2 += num1;
        System.out.println("+= Output: "+num2);

        num2 -= num1;
        System.out.println("-= Output: "+num2);

        num2 *= num1;
        System.out.println("*= Output: "+num2);

        num2 /= num1;
        System.out.println("/= Output: "+num2);

        num2 %= num1;
        System.out.println("%= Output: "+num2);

    }
}

结果输出:

= Output: 10
+= Output: 20
-= Output: 10
*= Output: 100
/= Output: 10
%= Output: 0

3. 自增和自减运算符

自增和自减运算符,只操作一个变量,是变量的值发生改变。

  • num++ (等价 num = num + 1)自增,主要针对数值变量,使自身变量的值加1。
  • num—(等价 num = num -1)自减,主要针对数值变量,使身变量的值减去1。
public class OperatorsDemo {

    public static void main(String[] args) {
        int num1=100;
        int num2=200;
        num1++;
        num2--;
        System.out.println("num1++ is: "+num1);
        System.out.println("num2-- is: "+num2);
    }
}

结果输出:

num1++ is: 101
num2-- is: 199

4. 逻辑运算符

逻辑运算符,顾名思义用于逻辑判断,运算的结果为boolean 类型的值,即 true 或者 false。逻辑匀运算符有

逻辑运算符 逻辑关系
&&
` `

b1 && b2:如果b1和b2都为真,b1 && b2将返回true,否则返回false

b1 || b2:如果b1和b2都是假,将返回false,否则返回true。

!b1:将返回与b1相反的值,如果b1为false,则返回true;如果b1为true,则返回false

public class OperatorsDemo {

    public static void main(String[] args) {
        boolean b1 = true;
        boolean b2 = false;

        System.out.println("b1 && b2: " + (b1&&b2));
        System.out.println("b1 || b2: " + (b1||b2));
        System.out.println("!(b1 && b2): " + !(b1&&b2));
        
    }
}

输出结果:

b1 && b2: false
b1 || b2: true
!(b1 && b2): true

逻辑短路:

在Java中,逻辑运算符支持短路操作,一旦能够明确表达整个表达式的值,我们就不需要计算表达式的余下部分了。比如我们需要判断一个对象不为空且它的某个方法返回值不为空,我们就可以这样判断:

if (object != null && object.someFunction() != null) {
    // do something.
}

如果object为空,第一部分表达式object != null会返回false,那么不管&&运算符后面的表达式object.someFunction() != null的结果如何,最终的值都为false。编译器会自动将这部分运算进行优化,不会执行object.someFunction() != null

5. 关系运算符

用来比较两个变量数据的大小,返回boolean的值,即 true 或者 false

关系操作符包括:

关系运算符 关系
> 大于
< 小于
== 等于
!= 不等于
>= 大于等于
<= 小于等于

'=='和'!='适用于所有类型的值和对象(即基本类型变量和引用类型变量)。

'>'、'<'、'>='和'<='不适用于布尔类型的值,因为它们只有truefalse,大于和小于并无实际意义。

public class OperatorsDemo {

    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 50;
        if (num1==num2) {
            System.out.println("num1 and num2 are equal");
        } else{
            System.out.println("num1 and num2 are not equal");
        }

        if( num1 != num2 ){
            System.out.println("num1 and num2 are not equal");
        } else{
            System.out.println("num1 and num2 are equal");
        }

        if( num1 > num2 ){
            System.out.println("num1 is greater than num2");
        } else{
            System.out.println("num1 is not greater than num2");
        }

        if( num1 >= num2 ){
            System.out.println("num1 is greater than or equal to num2");
        } else{
            System.out.println("num1 is less than num2");
        }

        if( num1 < num2 ){
            System.out.println("num1 is less than num2");
        } else{
            System.out.println("num1 is not less than num2");
        }

        if( num1 <= num2){
            System.out.println("num1 is less than or equal to num2");
        } else{
            System.out.println("num1 is greater than num2");
        }

    }
}

输出结果:

num1 and num2 are not equal
num1 and num2 are not equal
num1 is not greater than num2
num1 is less than num2
num1 is less than num2
num1 is less than or equal to num2

6. 位运算符

位运算符面向的运算对象是二进制的“位”,可应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型,运算时会将其对应Bit位(0或者是1)进行布尔代数运算或者移动操作。

位运算符 计算逻辑
& 与运算:对于某一位,只要两个操作数都为1,则该位的结果为1,否则为0
` ` 或运算:对于某一位,只要两个操作数有一个为1,则该位的结果为1,否则为0
^ 异或运算:对于某一位,如果两个操作数不相同,则该位的结果为1,否则为0
~ 非运算:按位补运算符翻转操作数的每一位
<< 二进制左移运算符:左操作数按位左移右操作数指定的位数
>> 二进制右移运算符:左操作数按位右移右操作数指定的位数
>>> 二进制右移补零操作符:左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充

计算逻辑的描述读起来有些晦涩,我们通过例子可以更清晰得了解位运算符如何进行计算。假设如果x等于60;y等于13;则它们的二进制表示,以及位运算的结果如下所示:

x = 0011 1100
y = 0000 1101
-----------------
x & y = 0000 1100
x | y = 0011 1101
x ^ y = 0011 0001
~x  = 1100 0011  
x << 2 = 1111 0000
x >> 2 = 0000 1111
x >>> 2 = 0000 1111

注意>>>>>的区别:

  • 右移位运算符>>,若操作的值为正,则在高位插入0;若值为负,则在高位插入1;
  • 右移补零操作符>>>,无论正负,都在高位插入0。

位运算不理解,先跳过。实际用到的时候,可以再去研究。

7. 运算符的优先级

运算符优先级决定一个表达式里术语的分组。它影响着一个表达式如何求值。一定的运算符比其他运算符拥有更高的优先级。

例如:乘法运算符比加法运算符有更高的优先级,表达式1 + 5 * 6,根据运算符的优先级,编译器会先计算5 * 6,再计算30 + 1,最终得到结果31

各类各运算符的优先级从大到小如下:

  1. ., (), []
  2. 单目+(右到左结合), 单目-(右到左结合), ++, --, ~, !
  3. *, /,%
  4. +(左到右结合), -(左到右结合)
  5. >>, <<, >>>
  6. <, <=, >, >=
  7. ==, !=
  8. &
  9. |
  10. ^
  11. &&
  12. ||
  13. ?:
  14. =, +=等赋值运算符

不用担心这么复杂的优先级列表,绝大多数情况下,表达式本身就很容易看得出优先级,比如赋值运算肯定是优先级最低的。在对优先级不太明确的情况下,我们使用括号就能按照我们希望的方式来改变优先级,所以不需要对运算符优先级做太多记忆。

8.其他运算符

三运运算符:

Java中的条件运算符是一个三元运算符,它的形式如下:

booleanExpression ? valueWhenTrue : valueWhenFalse

如果布尔表达式值为true,则表达式的值为valueWhenTrue的值,否则为valueWhenFalse的值。

比如我们要计算x的绝对值,可以通过如下代码实现:

if (x >= 0) {
    y = x;
} else {
    y = -x;
}

通过三元运算符,只需要一条语句y = x >= 0 ? x : -x;就可以完成,更为简洁。

类型转换运算符:

我们在很多情况下会用到类型转换。在适当的时候,Java也会根据数据类型将数据类型自动转为另一种。比如我们为float变量赋一个整数值,编译器会将int转化为float赋给变量。

但是在很多情况下,Java并不能判断我们是否需要进行类型转换,这时就需要类型转化运算符,它允许我们显式地进行类型转换扣扣交流群:468439140,如:

int a = 10;
long b = (long) a;
long c = (long) 100;

我们对变量和常量都能进行类型转换。

在对浮点数进行类型转换时,我们需要注意截尾的问题。如我们要将10.9进行类型转换:(int) 10.9,它的值并不是四舍五入的11,而是10。

这些都是一些 Java 中的规则,尽量去熟练掌握,多用代码去实际实验一下,练习几遍,不要死记硬背。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容

  • 数据类型转换: 1.当赋值符号两边的数据类型不同的时候,数据类型转换是自动的,不需要程序员插手 当给 int 类型...
    Munin_阅读 806评论 0 2
  • 转义字符 转义字符的形式其实就是\* ,单个字符用''单引号,多个字符则用""双引号。想要几个*,就写几个转义字符...
    腹黑小叶子orz阅读 679评论 3 1
  • 记得之前古天乐参加某节目时说为了拍戏,他3天瘦了30斤,方法是每天不吃东西只喝水,隔4个小时跑2个小时,一...
    云欢雨笑阅读 211评论 0 0
  • 与君别后,三月有余; 我心惘惘,远隔重城。 等闲离别,黯然销魂; 思君不见,芳草蔓生。 满眼春风,百事非昨; 不及...
    苏长亭阅读 462评论 17 13
  • 这些天天气一直不好阴雨连绵 ,就好比我最近的心情。从我来到社会上这些年来发生了很多事,这些事影响了我的心情也改...
    冰块CJH阅读 120评论 0 0