Java 中的运算符和流程控制相关内容的理解
Posted 唐雕
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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"); } } }
选择结构
循环结构:
以上是关于Java 中的运算符和流程控制相关内容的理解的主要内容,如果未能解决你的问题,请参考以下文章