• 运算符和表达式


    运算符

    ​ 在Java中用于程序计算的操作符统称为运算符,运算符分为如下几类

    1、算术运算舒服

    运算符 说明 例如
    + 两个数相加。可以运算,如果一边存在字符串,则当作连接符 a+b
    - 两个数相减,减号也可以表示负数 a-b
    * 两个数i相乘,其中*不能省略 a*b
    / 两个数相除 a/b
    % 两个数取余 a%b

    ​ // 总结 ++ -- 的优先级高于 + ,-,*,、,%

     public static void main(String []  args){
            //  +  -  *  /  %    所有运算符在计算式必须保证 数据类型一致
            int num1 = 100;
            int num2 = 200;
            int sum = num1 + num2;
            int mul =  num1-num2;
            int num3 = -num2;   // -200
            System.out.println("两个数相加" +  sum); // + 表示连接符
            System.out.println("两个数相减" + mul);
            System.out.println( "num2: " + num2+ " ,num3:" + num3 );
            System.out.println("num1+num2="+ (num1+num2) );
    
    
            int sum2 = num1*num2;
            int sum3 = num1/num3;
            System.out.println(sum3);   // 控制台输出的快捷键 sout+ enter
           // System.out.println(num1/sum3); //算术异常:ArithmeticException: / by zero
            // 取模
            System.out.println( 10%2);//0
            System.out.println(1%5);// 1
            System.out.println(2%5);
        }
    
    public static void main(String[] args) {
    // 自加  自减     ++  -- 只能对整数进行
            int i=1;
            i++ ;     // i = i + 1
            System.out.println("i:" + i);
            int j=1;
            ++j;    // j = j + 1
            System.out.println("j:" + j);
    
            int a =1;
            int sum = a++;  // 先将a的值赋值给sum  ,a再自加1
            int sum2 = ++a; // 先将a自加1 ,再将自加后的结果赋值给sum2
            System.out.println("sum:" + sum);
            System.out.println("sum2:" + sum2 );
            System.out.println("a:" +a);  // 3
    
            int sum3 = a++ + a++ ;
            System.out.println("sum3:"+sum3);
            System.out.println("a:"+a);
    
            // -- 操作  与++操作类似
            int b=1;
            int s1= b--;  // b = b -1     s1 的值为 先赋值再自减1   s1 = 1
            int s2 =  --b; // b = b -1   s2 的值为 先自减1 ,再赋值  s2 = -1
            System.out.println("b:"+b);
            System.out.println("s1:"+s1);
            System.out.println("s2:"+s2);
    
            // ++  --  综合
            int x=1;
            int y=2;
            int s3 = x++ + --x * (y-- + ++x);
            System.out.println("x:"+x);// 2
            System.out.println("y:"+y);// 1
            System.out.println("s3:"+s3);// 5
        }
    

    2、比较运算符

    ​ 用于比较两个表达式之间的结果,结果返回 true,false

    比较运算符
    > 比较左边的数是否大于右边的数,如果大于返回true,否则返回false a>b,3>5
    < 比较左边的书是否小于右边的数,如果小于返回true,否则返回false a<b
    >= 比较左边的数是否大于等于右边的数,如果大于或等于返回true,否则返回false a>=b
    <= 比较左边的数是否小于等于右边的数,如果小于或等于返回true,否则返回false
    == 比较==两边是否相等,如果相等返回true,否则返回false,对于基本数据类型比较数值是否相等,对于引用数据类型比较,他们的地址是否相等(变焦地址就是比较是否同一块内存) 1==2
    != 比较左边的数是否不等于右边的数,如果不相等返回true,否则返回false 1!=2

    注意: 不能连写 例如 1<3<5

    public static void main(String[] args) {
              // 比较运算符
            int a =1;
            int b =2;
           // a>b;  // 不能单独比较 必须接受结果或输出
            System.out.println(a>b);  //false
            System.out.println(a<b);  //true
            System.out.println(a==b); //false
            System.out.println(a!=b); //true
            // 增加逻辑判断
            // 如果 if 后面的条件成立,  则执行if里面的语句 ,如果不成立 则只需else语句
            if(a>b){
                System.out.println("a>b成立");
            }else{
                System.out.println("不成立");
            }
    
        }
    

    3、赋值运算符

    ​ 将表达式的结果赋值给一个变量,只能赋值给变量,不能赋值给常量

    ​ 例如:a=3

    赋值运算符 说明 案例
    = 将=右边的结果 赋值给左边的变量 int a=2,将2赋值给a
    += 计算后的赋值,将+=右边的结果赋值给左边的变量 a+=2等价于a=a+2
    -= 计算后的赋值,将-=右边的结果赋值给左边的变量 a-=b等价于a=a-b
    *= 同上,将右边的结果赋值给左边的变量 a=b等价于a=ab
    /= 同上,将右边的结果赋值给左边的变量 a/=b等价于a=a/b
    %= 同上,将右边的结果赋值给左边的变量 a%=b等价于a=a%b

    //赋值运算符 = +=  *= -= /= %=
            int a=2;
            a+=2;
            System.out.println(a);
            a-=3;
            System.out.println(a);
            a*=2;
            System.out.println(a);
            a/=4;
            System.out.println(a);
            a%=2;
            System.out.println(a);
    
            a+=a-=3;//a=a+(a-3)
            System.out.println("a="+a);
    
            int x=2;
            x+=x-=x*=x++;
            //x=x+(x=x-(x=x*(x++)))
            //x=2+(2-4)
            //x=0
            System.out.println("x="+x);
            int y=2;
            y*=y+=y;
            System.out.println(y);
    

    4、逻辑运算符

    ​ 在Java中用于两个或两个以上的表达式,去逻辑判断的结果,通常需要使用逻辑运算符

    逻辑运算符
    & 逻辑与,左右两边可以连接表达式,当两个表达式都成立时,整个结果为true true&true 、 false&true false&false 、true&false
    | 逻辑或,左右两边的表达式,任意一个成立,整个结果为true
    逻辑非 对表达式取反 !false !true
    && 短路与,与&类似,特点:符号左边为false,右边不再运算 true&&true true&&false
    || 短路或,与|类似,特点:符号左边为true,右边不再运算 false||true false||false
    / 逻辑运算符
            System.out.println(true & true); // true
            System.out.println(true & false);// false
            System.out.println(false & true); // false
            System.out.println(false & false);// false
            // true&true
            System.out.println(1>0 & 3>1);
            System.out.println(1>0 && 3>1);
            // | 或
            System.out.println(true | true); //true
            System.out.println(true | false);// true
            System.out.println(false | true); // true
            System.out.println(false | false);// false
            // || 短路或
            System.out.println(true || false) ;// true
    

    总结:&与&&的区别 |与||的区别

    问答1.&对于符号两边的表达式都会执行 &&符号左边为true,则右边不执行

    ​ |对于符号两边的表达式都会执行,||符号左边为true,则右边不执行

    int a=1;
            int b=2;
         //   System.out.println(a>b && b++>0);  // 符号右边的不运算
         //   System.out.println("b:"+b);
    
            System.out.println(a>b & b++>0); // 符号两边都运行
            System.out.println("b:"+b);
    
            // || 与 | 的区别
          //  System.out.println(a>=1 ||  a++<0); // a++ 不执行
          //  System.out.println("a:"+a);
    
            System.out.println(a>=1 | a++<0 );  // a++ 会执行
            System.out.println("再次输出a :" + a);
    

    ​ 2、十进制转二进制

    十进制 转换 二进制
    1 1*2的0次方 1
    2 1*2的1次方 10
    4 1*2的2次方 100
    对于2的倍数,先查找理他最近的且比他小的2的倍数,然后插值再计算二进制(使用拆分发)例如28=16+8+4=11100 34=32+2=100010 96=64+32=1100000
    16 1*2的4次方 10000

    ​ 二进制转十进制

    ​ 公式:从个位开始,每个位上的数*2的n次方来加之和

    ​ 100100=1*2的2次方+1 * 2的5次方=36

    5、移位运算符

    移位运算符 说明 案例
    << 左移:将一个数转移成二进制之后,整体往左移动n位,扩大倍数,一个数向左移动n位,结果位这个数*2的n次方 3<<2=3*2的2次方
    >> 右移:将一个数转成二进制之后,整体往右移动n位,缩小倍数,一个数向右移动n位,结果位这个数除以2的n次方(除不尽单独考虑) 8>>2-=8/2的2次方
    >>> 无符号的右移,不考虑符号位,将这个数整体往右移动n位
    ^n 异或
    -n 数值取反

    正数的移位:

    //正整数的移位<< >>  >>>
            System.out.println(3<<2);//12
            System.out.println(7<<3);//56
    
            //对于整数的无符号右移和右移结果一杨
            System.out.println(16>>2);//4
            System.out.println(17>>2);//4
    
            System.out.println(5^9);//12
    
            System.out.println(3>>2);//0
            System.out.println(3>>>2);//0
    
            System.out.println(~5);
    
    

    负数的移位

    //负数的移位
            //负数的左移位还是位负数
            System.out.println(-4<<2);//-4*2的2次方
            /**
             * -4的原码:10000....00000100
             * -4的反码:11111....11111011
             * -4的补码:11111....11111100
             * 开始移位:11111....11110000
             *
             * 取反:    10000....00001111
             * 补码:    10000....00010000=-16
             */
    
            //补码=反码+1
            //负数是对于补码进行位移
            System.out.println(-4>>1);//-4/2=-2
    
            //-16无符号右移两位
            System.out.println(-16>>>2);
    
            //-16的补码算出来
            /**
             * 10000...00010000
             * 反码11111...111011111
             * 补码11111...111100000
             *     00111...111111000由于不考虑符号,移动后高位全部补0变成正数
             *     正数的原码和补码一致  这个数即为所得
             *     1073741820
             */
    
            System.out.println(~5);
            //0000...00000101
            //1111...11111010取反后成了负数  继续还原
            //1000...00000101+1=
            //1000...00000110=-6
    

    6、三目运算符

    ​ 表达式?结果1:结果2

    ​ 当? 当?前面成立时, 整个表达式输出 结果1 ,如果?前面不成立,则输出结果2

    //生成100以内的随机数
            System.out.println(Math.random());
    
            int n = (int)(Math.random()*100);
            System.out.println("n:"+n);
            System.out.println(n%2==0?"这个数是偶数":"这个数是奇数");
    
    优先级 运算符 结核性
    1 ()【】{} 从左到右
    2 !+、-、++、-- 从右到左
    3 *、/、% 从左到右
    4 << 、>>、>>> 从左到右

    二、表达式

    表达式通过运算符和操作数组成的元素,表达式不能单独写在程序中,需要接收结果或输出。

    表达式

    注意:这里的()表示方法的括号,点好表示小数点,[]表示数组的下标

    2~5用于得到结果值

    6~12用于运算得到true、false

    13、14:是赋值,赋值的优先级最低

    语句块:

    ​ 在一个方法中,可以使用{}表示一个语句块

    //定义一个方法中的代码块
            {
    
                //局部变量只能使用再它所在的区域
                int a = 1;
                a++;
                System.out.println("这是一个方法里面的代码块 " + a);
            }
            //a++;
            if (true) {
                System.out.println("这是一个if的语句块");
    
  • 相关阅读:
    [武汉集训] Cliquers
    [NOI2017] 泳池
    [NOWCODER7] 小睿睿的方案
    动态dp初探
    [WC2008] 游览计划
    插头dp初探
    最小斯坦纳树初探
    2020ccpc总结
    Finding Palindromes
    最长非严格上升子序列的思考 && CF 1437E Make It Increasing
  • 原文地址:https://www.cnblogs.com/zzk201/p/13743119.html
Copyright © 2020-2023  润新知