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");
		}
		
		
	}
	
}
 
  选择结构
 
循环结构:
 
 
 
 
 
 
 
 
 
 
 
 
 
原文地址:https://www.cnblogs.com/tangdiao/p/9416028.html