• 三、 java运算符与流程控制


      赋值运算

      赋值运算符:=,+=,-=,×=,/=,%=

    class fuzhiyunsuan{
            public static void main(String[] args){
                    int i1 = 10;
                    i1 += 3;//即i1 = i1 +3,但是这两者是有区别的
                    //例如下面
                    short s = 10;
                    //s = s + 3;编译是无法通过的,会损失精度
                    //s = (short)(s + 1);//强制修改精度,不建议
                    s += 1;//即可以实现运算,又不会更改s的数据类型;
                    System.out.println(s);
                    /*
                     赋值运算符:=,+=,-=,×=,/=,%=
                      */
    
                    //切记在java中=是赋值操作。
                    boolean b1 = false;
                    if(b1=true)
                            System.out.println("结果为真");
                    else
                            System.out.println("结果为假");
            }
    }
    root@debian:/home/jeff/java_coding/day003# java fuzhiyunsuan 
    11
    结果为真

      因为使用i = i+1可能无法通过编译,所以使用+=的方式赋值更好一些。还有在java中=是赋值,判断相等使用==。

      逻辑运算符

    class logiccal{
            public static void main(String[] args){
                    boolean a = true;
                    boolean b = false;
    
                    System.out.println(a & b);
                    System.out.println(a && b);
                    System.out.println(a | b);
                    System.out.println(a || b);
                    System.out.println(!a & b);
                    System.out.println(a ^ b);
    
            }
    }
    root@debian:/home/jeff/java_coding/day003# java logiccal 
    false
    false
    true
    true
    false
    true

      &与&&的区别

      &&是短路运算的与,即a&&b,当a为false是无论b是真还是假,结果都是假,故不再运行b,直接跳出计算。

    class logicdiff{
            public static void main(String[] args){
                    boolean b = false;
                    int i1 = 10;
                    if(b & (i1++) > 0){
                            System.out.println("good");
                    }else{
                            System.out.println("bad");
                    }
                    System.out.println(i1);
    
                    int i2 = 10;
                    if(b && (i2++) > 0){
                            System.out.println("good");
                    }else{
                            System.out.println("bad");
                    }
                    System.out.println(i2);
    
    }
    }
    root@debian:/home/jeff/java_coding/day003# java logicdiff 
    bad
    11
    bad
    10

      在此处即&左边为false,右边i++依然计算了,结果+1,&&右边未+1。更建议使用&&。

    class logicdiff{
            public static void main(String[] args){
                    boolean b = false;
                    int i1 = 10;
                    if(b & (10 / 0 == 0){
                            System.out.println("good");
                    }else{
                            System.out.println("bad");
                    }
                    System.out.println(i1);
    
                    int i2 = 10;
                    if(b && 10/0 == 0){
                            System.out.println("good");
                    }else{
                            System.out.println("bad");
                    }
                    System.out.println(i2);
    
    }
    }

      此处&在编译过程中会报错,但是&&则会通过编译。

      |与||同理。

      位运算

    class bitcal{
            public static void main(String[] args){
                    int i1 = 31;
                    System.out.println(i1<<3);
                    System.out.println(i1<<28);
    
                    System.out.println(i1>>2);
                    System.out.println(i1>>>2);
    
                    int i2 = -31;
                    System.out.println(i2>>2);
                    System.out.println(i2>>>2);
            }
    }
    root@debian:/home/jeff/java_coding/day003# java bitcal 
    248
    -268435456
    7
    7
    -8
    1073741816

      位移运算可能导致精度丢失。无符号位运算在负数时变化较大。

      两个变量换位问题

    class exchange{
            public static void main(String[] args){
                    int m = 111;
                    int n = 233;
                    System.out.println("m:"+m+"n:"+n);
                    //1.提供中间变量
                    int temp = m;
                    m = n;
                    n = temp;
                    System.out.println("m:"+m+"n:"+n);
    
                    //2.m,n较大可能会损失精度
                    m = m+n;
                    n = m-n;
                    m = m-n;
                    System.out.println("m:"+m+"n:"+n);
    
                    //3.位运算
                    m = m^n;
                    n = m^n;
                    m = m^n;
                    System.out.println("m:"+m+"n:"+n);
            }
    }

      运行结果

    root@debian:/home/jeff/java_coding/day003# java exchange 
    m:111n:233
    m:233n:111
    m:111n:233
    m:233n:111

       三元表达式

      格式:(条件表达式)?表达式1:表达式2;

      当条件表达式为真,则运算结果为表达式1,当条件表达式为假,则运算结果为表达式2。

      表达式1和2应当为同种类型。

      三元表达式与if判断的差别为,三元表达式简化了if语句,三元表达式必须返回一个结果,if后面的代码快可以有多个语句。

    class sanyuan{
            public static void main(String[] args){
                    int i = 10;
                    int j = 20;
                    int max = (i > j)?i:j;
                    System.out.println("较大值是"+max);
    
                    String str = (i > j)?"i大":(i == j)?"相等":"j大";
                    System.out.println(str);
            }
    }

      运算结果

    root@debian:/home/jeff/java_coding/day003# java sanyuan 
    较大值是20
    j大

       流程控制

      顺序结构

      程序自上而下,逐行运行。

      分支结构

      根据条件选择某条分支运行

      循环结构,根据循环条件重复性的执行某段代码。

      if语句的三种格式

    if(true){执行代码块;}
    if(条件表达式){执行代码块;}
    else{执行代码块;}
    
    if(条件表达式){执行代码块;}
    else if(条件表达式){执行代码块;}
    。。。
    else{执行代码块;}
    import java.util.Scanner;
    class score{
            public static void main(String[] args){
                    //创建一个scanner对象,用于键入数字
                    Scanner uscore = new Scanner(System.in);
                    System.out.println("请输入考试成绩");
                    //调用此对象相应方法,完成键盘输入的值的获取
                    //next():表示从键盘获取一个字符串,int表示键入的是整型数值用于比较
                    int str = uscore.nextInt();
    
                    System.out.println("你的成绩是"+str);
    
                    if(str > 100 || str < 0){
                            System.out.println("你输入的成绩有误");
                    }
                    else{
                            if(str == 100){
                                    System.out.println("第一名");
                            }else if(str > 80 && str<=99){
                                    System.out.println("优秀");
                            }else if(str >=60 && str<= 80){
                                    System.out.println("一般");
                            }else{
                                    System.out.println("要加油啊");
                            }
                    }
            }
    }
    root@debian:/home/jeff/java_coding/day003# java score 
    请输入考试成绩
    13
    你的成绩是13
    要加油啊
    root@debian:/home/jeff/java_coding/day003# java score       
    请输入考试成绩
    100
    你的成绩是100
    第一名
    root@debian:/home/jeff/java_coding/day003# java score 
    请输入考试成绩
    76
    你的成绩是76
    一般

       switch语句

    switch(变量){
            case 值1:
            case 值2:
    ...
            default:
    }
    class switch1{
            public static void main(String[] args){
                    int i = 1;
                    switch(i){
                            case 0:
                                    System.out.println("零");
                            case 1:
                                    System.out.println("一");
                            case 2:
                                    System.out.println("二");
                            default:
                                    System.out.println("其他");
                    }
            }
    }

      运行结果

    root@debian:/home/jeff/java_coding/day003# java switch1 
    一
    二
    其他

      没有break退出循环体,那么匹配到分支以后还会继续执行其下的case语句。

      default是可选的,而且位置是灵活的。

    class switch2{
            public static void main(String[] args){
                    int i = 5;
                    switch(i){
                            default:
                                    System.out.println("其他");
                            case 0:
                                    System.out.println("零");
                            case 1:
                                    System.out.println("一");
                            case 2:
                                    System.out.println("二");
                    }
            }
    }

      运行结果

    root@debian:/home/jeff/java_coding/day003# java switch2 
    其他
    零
    一
    二
    class switch3{
            public static void main(String[] args){
                    int i = 5;
                    switch(i){
                            default:
                                    System.out.println("其他");
                                    break;
                            case 0:
                                    System.out.println("零");
                                    break;
                            case 1:
                                    System.out.println("一");
                                    break;
                            case 2:
                                    System.out.println("二");
                                    break;
                    }
            }
    }
    root@debian:/home/jeff/java_coding/day003# java switch3 
    其他

      switch里的变量类型可以是:char,byte,short,int,枚举,String(jdk1.7)

      case的条件只能是值不能是取值范围。

      注意:

      1. 取模的结果的符号取决于被模数,忽略模数的符号; 

      2.java的if(x=1){}的判断语句中如此赋值会报错,而不是与Python一样认同为条件为真,原因是java的Boolean类型只有两个值,不能是0和1.

      附:

      原码、反码、补码

      这里以java的byte类型来说明。

      八位二进制数的最高位是符号位,0为正数,1为负数,byte的范围是:-128~127。

      计算机底层存储都是补码形式,正数:原码、反码、补码都一样。负数则需要进行换算,比如在计算机底层存了一个1101 0011,这是一个负数的补码,所以先逆推出他的反码即补码-1=反码,反码就是1101 0010,通过反码再求出原码,原码=反码除符号位以外逐位取反,所以它的原码就是1010 1101,所以这个底层存的数值就是-45。 

      存在一个问题0000 0000 与1000 0000都是0,+0与-0定义重复了,实际上1000 0000实际值是-128: 

      1000 0001 :  这是补码  ->反码 1000 0000 -> 原码:1111 1111  -127

      1111 1111 :  这是补码  ->反码 1111 1110 -> 原码:1000 0001  -1
      1000 0000 :  特殊值  -127 - 1 = -128
      补码:
                        1000 0001 - 0000 0001 = 1000 0000
      所以byte的范围是-128~127,
  • 相关阅读:
    Redis 分布式锁
    Angular VS Blzaor
    Chorme 跨域的快捷解决
    旋转3角形
    .Netcore AD 操作
    .Netcore 2.2 和3.1 的模板
    Command3
    CSS Selector
    弹性盒子
    Label_strange_labels
  • 原文地址:https://www.cnblogs.com/Jeffding/p/8655961.html
Copyright © 2020-2023  润新知