zoukankan      html  css  js  c++  java
  • Java 中的运算符和流程控制相关内容的理解

      接着之前的运算符方面,今天主要回顾运算符的一些计算、优先级方面的内容,以及一些流程控制中if-else 方面的知识。
     
    赋值运算符
    (=、+=、-=、*=、/=、%=、&=、|=、^=、<<= 、>>=、 >>>=)
     
    byte/short/char 可以参与运算
    除了 = 以外,其余的符号都要求这个变量得先有值
    注意:在 Java 中不支持连等定义但是支持连等赋值
     
    int i = 5;
    i += i *= i -= 3;  -> 15
    i =  5 + (5 * (5 -3)) = 15
     
    int j = 7;
    j -= j *= j++;
    j=7-(7 *7) = -42
    

      

    关系/比较运算符
    (==相等  !=不等  >  <  >=  <=)
     
    注意:不支持连着得比较方式
     
    逻辑运算符
    (&与  |或  !非  ^异或  &&短路与 ||短路或)
     
    true & ture = true(就像是下棋,两个人都要来才能下这盘棋)
    |(让某一位同学打一杯水,这杯水打过来有一个同学去了就行了)
    (计算机中的二进制非真即假,要么是对的,要么是错的)
    ^(从物理学中总结出来的,指南针/磁石,只有一北一南才能碰到一起,相同为假,不同为真)
    &&(如果前边的表达式的结果为false,则后边的表达式就不再运算,整个表达式的结果就确定为 false)
    ||(如果前边的表达式的结果为 true,则后边的表达式就不再运算,整个表达式的结果就确定为 true)
    注意:||如果在 && 的前边可以把 && 短路掉
     
    位运算符
    注意:位运算符针对整数的补码进行运算,所以运算结果也是补码
    & | ^ <<  >>  >>> ~
     
     
    & :将数据转化为补码形式,然后将 0 看作false,将 1 看作 true,按位进行与运算,最后将结果转化位十进制来显示
            偶数 & 任意数字 = 偶数
            正数 & 任意数字 = 正数
            奇数 & 1 = 1    偶数 & 1 = 0
     
    |:7    00000111     将数据转化为补码形式,按位进行或运算,最后将结果转化位十进制显示 
        11  00001011     奇数 | 任意数字 = 奇数
        15  00001111     负数 | 任意数字 = 负数
     
    ^:7    00000111   将数据转化为补码形式,按位进行异或运算,最后将结果转化为十进制显示
          11  00001011   6^12 = 10,   10^6 = 12 
          12  00001100    i^i=0,j^0 = j , a^b^b=a
        交换值的方式
    方式一:异或法
    int i = 5, j = 9;
    i = i^j;
    j = i^j;   -> j = i^j^j;    ->j=i;
    i = i^j;   ->i = i^j^i;    ->i = j;
    方式二:加减法
    int i = 5, j = 9;
    i = i+j;
    j = i-j;  -> j=i+j-j;  -> j = i; 
    i = i-j;  ->i = i+j-i; ->i = j;
    方式三:追尾法
    int i = 5, j = 9;
    int temp = i;
    i = j;
    j = temp;
     
    总结:三种方式的比较
    异或法的效率是最高的。只能针对整数进行交换,局限性太大。(像小数,字符,字符串就不能交换)
    加减法的效率是低于异或但是高于追尾。理论上可以交换数值类型,但实际上很少用于交换小数。
    追尾法的效率是最低的。可以交换任意一个类型的值。
     
    <<
    3 << 3    00000011       <<:将数据转化为补码,然后按照指定的位数向左移动,高位次移出的数据舍弃,低位次空出的位置补 0,最后转化为十进制显示
     24  000 00011000        7 << 4 = 7 * 16=112(相当于乘以 2^4)
    在一定范围内,左移几位就是乘以 2 的几次方
    >> 
    10 >> 2    00001010      >>:将数据转化为补码,然后按照指定的位数向右移动,移出的数据舍弃,如果是正数,高位次空出补 0;如果是负数则补 1,最后将数据转化为十进制显示
                    0000001010   14 >> 3 =1
    在一定范围内,右移几位就是除以 2 的几次方
    正数右移越移越小,最小是 0    负数右移越移越大,最大到 -1
     
    >>>:无符号右移。将数据转化为补码之后,按照指定的位数向右移动,移出的数据舍弃,高位次空出,无论正负一律补 0。
    ~3    00000011       ~:将数据转化为补码之后,将 0<->1,最后将数据转化为十进制显示
             11111100        ~10 = -11    ~i = -i - 1
      -4   10000100
     
    三元运算符
    格式:逻辑值 ? 表达式1 : 表达式2
    执行顺序:先执行逻辑值,如果逻辑值为 true,执行表达式1;反之则执行表达式2
     
    注意:三元表达式本身是一个表达式,意味着这个表达式执行完成后需要一个结果  --- 这个结果必须能定义对应类型的变量来接住
    a > b ? "abc" : true;  -> 没有办法定义一个统一类型的结果来存储,这种写法就是错误的
    //三元表达式的嵌套
    int max = i > j ? (i > k ? i : k) : (j > k ? j : k);
    
    //练习:输出分数所对应的等级  >=90 -A  >=80 -B  >=70 -C  >=60 -D  <60 -E
            char level = score >= 90 ? 'A':(score >= 80 ? 'B' : (score >= 70 ? 'C' : (score >=60 ? 'D' : 'E')));
            System.out.println(level);
    扩展:从控制台获取数据
    import java.util.Scanner;
    Scanner s = new Scanner(System.in);
    int i = s.netInt();      //获取整数
    double d = s.nextDouble();      //获取小数
    String str = s.next();
    
    >= 大于等于      >>= 右移等于
    10 >= 2    -> true
    10 >>= 2   ->i = i >> 2;  -> 2
     
    运算符的优先级
    ~!    算术(++  --  *  /  %  +  - )  <<  >>  >>>    关系    逻辑&  | ^    三元    赋值
              一元                                            二元运算
    一元的几个运算符的优先级是一样的
     
    流程控制
    顺序结构:指代码从上到下从左到右来依次编译运行的
     
    分支结构:
      判断结构
    if(逻辑值){
        代码块
    }
    执行顺序:先执行逻辑值,如果逻辑值为 true,那么执行 代码块。
    注意:如果 if 中的代码块只有 1 句话,那么可以省略 {} 不写
    if(逻辑值){
        Code1;
    }else{
        Code2;
    }
    练习:
    1.输入三个数字,获取三个数字中的最小值
    import java.util.Scanner;
    public class IfElseExer {
    	
    	public static void main(String[] args){
    		
    		Scanner s = new Scanner(System.in);
    		int i = s.nextInt();
    		int j = s.nextInt();
    		int k = s.nextInt();
    		
    		/*
    		if(i < j){
    			if(i < k){
    				System.out.println(i);
    			} else {
    				System.out.println(k);
    			}
    		} else {
    			if(j < k){
    				System.out.println(j);
    			} else {
    				System.out.println(k);
    			}
    		}
    		*/
    		
    		int min = i;
    		
    		if(min > j)
    			min = j;
    		
    		if(min > k)
    			min = k;
    		
    		System.out.println(min);
    	}
    	
    }
    

      

    2.输入一个数字表示重量,如果重量<=20,则每千克收费 0.35 元;如果超过 20 千克不超过 100 千克的范围,则超过的部分按照每千克 0.5 元收费;如果超过 100 千克,则超过的范围按照每千克 0.8 元收费。
    import java.util.Scanner;
    public class IfElseExer2 {
    	
    	public static void main(String[] args){
    		
    		Scanner s = new Scanner(System.in);
    		double weight = s.nextDouble();
    		
    		double price = 0;
    		if(weight < 0){
    			System.out.println("不合法的重量!!!");
    		} else {
    			if(weight <= 20){
    				price = weight * 0.35;
    			} else {
    				if(weight <= 100){
    					price = 20 * 0.35 + (weight - 20) * 0.5;
    				} else {
    					price = 20 * 0.35 + 80 * 0.5 + (weight - 100) * 0.8;
    				}
    			}
    			
    		}
    		
    		System.out.println(price);
    		
    	}
    	
    }
    

      或者

    import java.util.Scanner;
    public class IfElseIfDemo {
    	
    	public static void main(String[] args){
    		
    		Scanner s = new Scanner(System.in);
    		double weight = s.nextDouble();
    		
    		double price = 0;
    		
    		if(weight < 0){
    			System.out.println("非法的重量!!!");
    		} else if(weight <= 20){
    			price = weight * 0.35;
    		} else if(weight <= 100){
    			price = 7 + (weight - 20) * 0.5;
    		} else {
    			price = 47 + (weight - 100) * 0.8;
    		}
    		
    		System.out.println(price);
    	}
    }
    

      

    if(逻辑值1){
        Code1;
    }else if(逻辑值2){
        Code2;
    }
    练习:
    输入一个数字表示月份,然后输出这个月份所对应的季节。 3 - 5 -春    6 - 8 - 夏    9 - 11 - 秋    12、1、2 - 冬
    import java.util.Scanner;
    public class IfElseIfExer {
    	
    	public static void main(String[] args){
    		
    		Scanner s = new Scanner(System.in);
    		int month = s.nextInt();
    		
    		if(month < 1 || month > 12){
    			System.out.println("Illegal month !!!");
    		} else if(month > 2 && month < 6){
    			System.out.println("Spring");
    		} else if(month > 5 && month < 9){
    			System.out.println("Summmer");
    		} else if(month > 8 && month < 12){
    			System.out.println("Autumn");
    		} else {
    			System.out.println("Winter");
    		}
    		
    		
    	}
    	
    }
     
      选择结构
     
    循环结构:
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    sql server mdx
    mysql 按照 汉字的第一个拼音排序
    转,mysql的select * into
    mysql 日期的操作
    google 地图api
    ip_test
    AJAX (转w3cschool)
    jquery ajax 失败
    安装AdventureWorks2008R2示例数据库
    弹出新的网页窗口 js
  • 原文地址:https://www.cnblogs.com/tangdiao/p/9416028.html
Copyright © 2011-2022 走看看