java运算符

java基础编程

java基本语法—运算符

运算符是一种特殊的符号,表示数据的运算、赋值和比较等。

  • 算术运算符
  • 赋值运算符
  • 比较运算符(关系运算符)
  • 逻辑运算符
  • 位运算符(用的少)
  • 三元运算符

2.4.1 运算符:算术运算符

算术运算符
/*
运算符之一:算术运算符
+ — + — * / % (前)++ (后)++ (前)-- (后)-- +

*/
class AriTest{
    public static void main(String[] agra){
        //除号:/
        int num1 = 12;
        int num2 = 5;
        int result1 = num1 / num2;
        System.out.println(result1);//2

        int result2 = num1 / num2 * num2;
        System.out.println(result2);//10

        double result3 = num1 / num2;//先算的仍然是int型,算完赋值给double
        System.out.println(result3);//2.0

        double result4 = num1 / num2 + 0.0;//2.0
        double result5 = num1 / (num2 + 0.0);//2.4
        double result6 = (double)num1 / num2;//2.4
        System.out.println(result5);
        System.out.println(result6);

        //%:取余运算
        //结果符号与被模数的符号相同
        //开发中,经常使用%来判断能否被除尽的情况
        int m1 = 12;
        int n1 = 5;
        System.out.println("m1 % n1 = " + m1 % n1);

        int m2 = -12;
        int n2 = 5;
        System.out.println("m2 % n2 = " + m2 % n2);

        int m3 = 12;
        int n3 = -5;
        System.out.println("m3 % n3 = " + m3 % n3);

        int m4 = -12;
        int n4 = -5;
        System.out.println("m4 % n4 = " + m4 % n4);

        //(前)++:先自增1,然后再运算
        //(后)++:先运算,后自增1
        int a1 = 10;
        int b1 = ++a1;
        System.out.println("a1 = "+ a1 + ",b1 = "+ b1);

        int a2 = 10;
        int b2 = a2++;
        System.out.println("a2 = "+ a2 + ",b2 = "+ b2);

        int a3 = 10;
        ++a3;//a3++;
        int b3 = a3;
        
        //注意点:
        short s1 = 10;
        //s1 = s1 + 1;//编译失败:从int型转short型会有损失
        //s1 = (short)(s1 + 1);//正确的
        //1为常量是int型,结果不好给short型
        //short占2个字节,1占4个字节,它们先相加,之后short()再截掉多余的两个字节
        s1++;//自增1不会改变本身变量的数据类型
        System.out.println(s1);

        //问题:
        byte bb1 =127;
        bb1++;//编译可以通过
        System.out.println("bb1 = " + bb1);//-128

        //(前)-- :先自减1,后运算
        //(后)-- :先运算,后自减1
        
        int a4 = 10;
        int b4 = a4--;//int b4 = --a4;
        System.out.println("a4 = " + a4 + ",b4 = " + b4);

    }
}

练习1

练习
  • i = 10 i1 = 11
  • i = 12 i1 = 12
  • i = 20 i2 = 19
  • i = 18 i2 = 18

练习2

随意给出一个三位数的整数,打印显示它的个位数,十位数,百位数的值。

/*
练习:随意给出一个三位数的整数,打印显示它的个位数,十位数,百位数的值。
格式如下:
数字xxx的情况如下:
个位数:
十位数:
百位数:

例如:
数字153的情况如下:
个位数:3
十位数:5
百位数:1

*/
class AriExer {
    public static void main(String[] args) {
        
        int num = 187;
        
        int bai = num / 100;
        //先取模100,再除以10
        int shi = num % 100 / 10;//int shi = num / 10 % 10;
        int ge = num % 10;
        //取模1结果是0
        
        System.out.println("百位为:" + bai);
        System.out.println("十位为:" + shi);
        System.out.println("个位为:" + ge);

    }
}

2.4.2运算符:赋值运算符

  • 符号: =
    • 当“=”两侧数据类型不一致时,可以使用自动类型转换或使用强制类型转换原则进行处理 。
    • 支持连续赋值
  • 扩展赋值运算符: +=,-=,*=,/=, %=
/*
运算符之二:赋值运算符
=  +=  -=  *=  /=  %= 


*/
class SetValueTest {
    public static void main(String[] args) {
        //赋值符号:=
        int i1 = 10;
        int j1 = 10;

        int i2,j2;
        //连续赋值
        i2 = j2 = 10;

        int i3 = 10,j3 = 20;
        
        //*********************
        int num1 = 10;
        num1 += 2;//num1 = num1 + 2;
        System.out.println(num1);//12

        int num2 = 12;
        num2 %= 5;//num2 = num2 % 5;
        System.out.println(num2);//2

        short s1 = 10;
        //s1 = s1 + 2;//编译失败,int不能转换为short
        s1 += 2;//结论:不会改变变量本身的数据类型
        System.out.println(s1);//12

        //开发中,如果希望变量实现+2的操作,有几种方法?(前提:int num = 10;)
        //方式一:num = num + 2;
        //方式二:num += 2; (推荐)
        
        //开发中,如果希望变量实现+1的操作,有几种方法?(前提:int num = 10;)
        //方式一:num = num + 1;
        //方式二:num += 1; 
        //方式三:num++; (推荐)
        
        //练习1
        int i = 1;
        i *= 0.1;//0.1是double,编译通过,但i还是int
        System.out.println(i);//0
        i++;
        System.out.println(i);//1

        //练习2
        int m = 2;
        int n = 3;
        n *= m++; //n = n * m++;    
        System.out.println("m=" + m);//3
        System.out.println("n=" + n);//6
        
        //练习3
        int n1 = 10;
        n1 += (n1++) + (++n1);//n1 = n1 + (n1++) + (++n1);从作往右10 + 10 +12
        System.out.println(n1);//32

    }
}

2.4.3运算符:比较运算符

比较运算符
/*
运算符之三:比较运算符
==  !=  >  <  >= <=  instanceof

结论:
1.比较运算符的结果是boolean类型
2.区分 ==  和  = 
*/
class CompareTest {
    public static void main(String[] args) {
        int i = 10;
        int j = 20;

        System.out.println(i == j);//false
        System.out.println(i = j);//20,现将j赋值给i,再输出i

        boolean b1 = true;
        boolean b2 = false;
        System.out.println(b2 == b1);//false
        System.out.println(b2 = b1);//true
    }
}

2.4.4逻辑运算符

逻辑运算符
  • 逻辑运算符用于连接布尔型表达式,在 Java中不可以写成 3<x<6,应该写 成x>3 & x<6 .
  • “&” 和“ &&” 的区别:
    • 单&时,左边无论真假,右边都进行运算;
    • 双&时,如果左边为真,右边参与运算,如果左边为假,右边不参与运算。
  • "|"和"||"同理,||表示:当左边为真,右边不参与运算。
  • 异或(^)与或(|)不同之处是,当左右都为true,结果为false
  • 异或,追求的是"异"
/*
运算符之四:逻辑运算符

&  && |  || ! ^

说明:
1.逻辑运算符操作的都是boolean类型的变量


*/
class LogicTest {
    public static void main(String[] args) {
        
        //区分& 与 &&
        //相同点1:& 与  && 的运算结果相同
        //相同点2:当符号左边是true时,二者都会执行符号右边的运算
        //不同点:当符号左边是false时,&继续执行符号右边的运算。&&不再执行符号右边的运算。
        //开发中,推荐使用&&
        boolean b1 = true;
        b1 = false;
        int num1 = 10;
        if(b1 & (num1++ > 0)){
            System.out.println("我现在在北京");
        }else{
            System.out.println("我现在在南京");
        }

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

        boolean b2 = true;
         b2 = false;
        int num2 = 10;
        if(b2 && (num2++ > 0)){
            System.out.println("我现在在北京");
        }else{
            System.out.println("我现在在南京");
        }

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

        // 区分:| 与 || 
        //相同点1:| 与  || 的运算结果相同
        //相同点2:当符号左边是false时,二者都会执行符号右边的运算
        //不同点3:当符号左边是true时,|继续执行符号右边的运算,而||不再执行符号右边的运算
        //开发中,推荐使用||
        boolean b3 = false;
        b3 = true;
        int num3 = 10;
        if(b3 | (num3++ > 0)){
            System.out.println("我现在在北京");
        }else{
            System.out.println("我现在在南京");
        }
        System.out.println("num3 = " + num3);


        boolean b4 = false;
        b4 = true;
        int num4 = 10;
        if(b4 || (num4++ > 0)){
            System.out.println("我现在在北京");
        }else{
            System.out.println("我现在在南京");
        }
        System.out.println("num4 = " + num4);
    }
}

2.4.5运算符:位运算符

位运算符
  • 左右移是针对二进制进行整体移动
  • 每向左移动一位,相当于在原来数据基础上乘以2
左右移示例
/*
运算符之五:位运算符 (了解)

结论:
1. 位运算符操作的都是整型的数据
2. << :在一定范围内,每向左移1位,相当于 * 2
   >> :在一定范围内,每向右移1位,相当于 / 2,如果二进制最高位为0,左边拿0补,最高位为1,左边拿1补
   >>> : 无符号往右移,空位都用0补


面试题:最高效方式的计算2 * 8 ?  2 << 3  或 8 << 1
*/
class BitTest {
    public static void main(String[] args) {
        int i = 21;
        i = -21;
        //i左移2位,21 * 4 = 84
        //整个最多32位,移到27位时,最高位为1,为负,物极必反
        System.out.println("i << 2 :" + (i << 2));
        System.out.println("i << 3 :" + (i << 3));
        System.out.println("i << 27 :" + (i << 27));

        //&与
        //00001100  12
        //00000101  5
        //00000100  4   只要有0,结果是0,都是1,结果才是1
        
        //|或
        //00001100  12
        //00000101  5
        //00001101  13  只要有1,结果就是1

        //^异或
        //00001100  12
        //00000101  5
        //00001001  9   两个不一样,结果才是1

        //~取反~6 = -7(按位取反后是补码,需要进一步转回原码,减1再取反)
        //0000 0000 0000 0000 0000 0000 0000 0110   6
        //1111 1111 1111 1111 1111 1111 1111 1001   -7(的补码)
        //如果把6最高位改为1,则是-6的原码,再改成-6的反码,就是除了符号位之外,互相取反
        int m = 12;
        int n = 5;
        System.out.println("m & n :" + (m & n));//4
        System.out.println("m | n :" + (m | n));//13
        System.out.println("m ^ n :" + (m ^ n));//9

        //练习:交换两个变量的值
        int num1 = 10;
        int num2 = 20;
        System.out.println("num1 = " + num1 + ",num2 = " + num2);

        //方式一:定义临时变量的方式
        //推荐的方式
        int temp = num1;
        num1 = num2;
        num2 = temp;

        //方式二:好处:不用定义临时变量  
        //弊端:① 相加操作可能超出存储范围 ② 有局限性:只能适用于数值类型
        //num1 = num1 + num2;
        //num2 = num1 - num2;
        //num1 = num1 - num2;

        //方式三:使用位运算符
        //有局限性:只能适用于数值类型
        //num1 = num1 ^ num2;
        //num2 = num1 ^ num2;
        //num1 = num1 ^ num2;

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

    }
}
异或再异或

2.4.6:三元运算符

格式
/*
运算符之六:三元运算符
1.结构:(条件表达式)? 表达式1 : 表达式2
2. 说明
① 条件表达式的结果为boolean类型
② 根据条件表达式真或假,决定执行表达式1,还是表达式2.
  如果表达式为true,则执行表达式1。
  如果表达式为false,则执行表达式2。
③ 表达式1 和表达式 2要求是一致的。
④ 三元运算符可以嵌套使用

3. 
凡是可以使用三元运算符的地方,都可以改写为if-else
反之,不成立。

4. 如果程序既可以使用三元运算符,又可以使用if-else结构,那么优先选择三元运算符。原因:简洁、执行效率高。
*/
class SanYuanTest {
    public static void main(String[] args) {
        
        //获取两个整数的较大值
        int m = 12;
        int n = 5;
        //如果m>n,为true,返回m赋值
        int max = (m > n)? m : n;
        System.out.println(max);

        double num = (m > n)? 2 : 1.0;
        //表达式1和表达式2应该能用一个统一的类型去接受

        //(m > n)? 2 : "n大";//编译错误,类型不统一

        //**************************
        n = 12;//此处可以统一用字符串接受,可以套娃
        String maxStr = (m > n)? "m大" : ((m == n)? "m和n相等" : "n大");
        System.out.println(maxStr);

        //*****************************
        //获取三个数的最大值
        int n1 = 12;
        int n2 = 30;
        int n3 = -43;
        
        int max1 = (n1 > n2)? n1 : n2;
        int max2 = (max1 > n3)? max1 : n3;
        System.out.println("三个数中的最大值为:" + max2);

        //不建议
        //int max3 = (((n1 > n2)? n1 : n2) > n3)? ((n1 > n2)? n1 : n2) : n3;
        System.out.println("三个数中的最大值为:" + max3);

        //该写成if-else:
        if(m > n){
            System.out.println(m);
        }else{
            System.out.println(n);
        }
    }
}

2.3.6运算符的优先级

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