逻辑运算符:
&&:逻辑与运算符,当且仅当两个操作数都为真,条件才为真
||:逻辑或运算符,如果两个操作数中任何一个为真,条件为真
!:逻辑非运算符,用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将得到false
三元运算符:
三元运算符,也叫条件运算符,可以接受三个值。格式如下:
result?A:b
如果result为true,则值为a;如果result为false,则值为b。
public class Test1 {
public static void main(String[] args) {
int a=10;
int b=20;
System.out.println(a > b ? ("最大值是" + a) : ("最大值是" + b));
}
}
运行结果:
最大值是20
位运算符
&:按位与运算符,如果相对应位都是1,则结果为1,否则为0
|:按位或运算符,如果相对应位都是0.则结果为0. 否则为1按位
^:异或运算符,如果相对应位值相同,则结果为0,否则为1
~:按位补运算符,翻转操作数的每一位, 即0变成1,1变成0
<<:按位左移运算符,左操作数按位左移右操作数所指定的位数。空位补0,被移除的高位丢弃。
“>>”:按位右移运算符,左操作数按位右移右操作数所指定的位数。被移位的二进制最高位是0,右移后,空缺位补0;最高位是1,高位补1。
“>>>”:无符号右移。按位右移补零操作符,左操作数的值按右操作数所指定的位数右移,被移位二进制最高位无论是0或者是1,空缺位都用0补。
public class Test2 {
public static void main(String[] args) {
int a=9;//原码:1001
int b=13;//原码:1101
System.out.println("按位操作a&b结果:"+(a&b));
System.out.println("按位操作a|b结果:"+(a|b));
System.out.println("按位操作a^b结果:"+(a^b));
System.out.println("按位操作~a结果:"+(~a));
System.out.println("按位操作a>>1结果:"+(a>>1));
System.out.println("按位操作a<<1结果:"+(a<<1));
}
}
运行结果:
按位操作a&b结果:9
按位操作a|b结果:13
按位操作a^b结果:4
按位操作~a结果:-10
按位操作a>>1结果:4
按位操作a<<1结果:18
&&与&的区别:
当符号两边都是布尔类型时,最终运算结果一样。不过,&&的运算效率更高一些。与逻辑,左边是false,整体是false。在用&&时,如果左边已经是false,整体就已经是false了,所以右边布尔类型不会再去判断。但使用&时,不管左边是true还是false,右边都会判断。
public class Test3 {
public static void main(String[] args) {
int i=1;
int j=2;
boolean n=((i++<1)&&(j++>0));
//左边是false,直接跳过,所以右边的j++没有执行
System.out.println(n);
System.out.println("i="+i+"\t"+"j="+j);
}
}
运行结果:
false
i=2 j=2
public class Test4 {
public static void main(String[] args) {
int i=1;
int j=2;
boolean n=((i++<1)&(j++>0));
//左边是false,继续执行右边的j++
System.out.println(n);
System.out.println("i="+i+"\t"+"j="+j);
}
}
运行结果:
false
i=2 j=3
||与|类似。前者在左边为真时,右边不会判断。后者两边都会判断。
“<<”: 把<<左边的数据乘以2的移动次幂 例如 10<<3 结果 10*2^3=80
“>>”: 把>>左边的数据除以2的移动次幂 例如 40>>3 结果 40/2^3=5
键盘录入语句:
(1)导包
import java.util.Scanner;
(2)创建键盘录入对象
Scanner x=new Scanner(System.in);
(3)获取键盘录入对象的值
int shou=x.nextInt();
条件控制语句
顺序结构只能按顺序执行,不能进行判断和选择,因此需要条件控制语句。条件控制语句可以使程序根据某个或某些条件进行判断,然后有选择性地执行或不执行某些代码语句。所有条件控制语句都是通过判断条件表达式的结果来选择执行哪个分支语句的,条件表达式返回true或false。
编程语言中一般有两种条件分支结构语句switch语句,下面将对这两种分支结构进行介绍。
if语句
格式:
if(布尔表达式){
//如果布尔表达式为true将执行的语句
}else{
//如果布尔表达式为false将执行的语句
}
如果布尔表达式的值是true,则会执行if语句中的代码块,否则执行else语句中的代码块,然后执行后面的代码。如果条件不止两个,我们还可以采用else if语句,格式如下:
if(布尔表达式1){
//如果布尔表达式1为true将执行的语句
}else if(布尔表达式2){
//如果布尔表达式2为true将执行的语句
}else if(布尔表达式3){
//如果布尔表达式3为true将执行的语句
}else{
//如果布尔表达式为false将执行的语句
}
else-if语句数目无限制,可根据具体情况编写。
public class Test5 {
public static void main(String[] args) {
int n=98;
if(n<0){
System.out.println("n是负数,n是"+n);
}else if (n > 0){
System.out.println("n是正数,n是"+n);
}else {
System.out.println("n非负非正,是0");
}
}
}
运行结果:
n是正数,n是98
if语句后面可以省略大括号“{}”,但是只会执行一条紧跟着的语句。这样的代码可读性差,有可能因为少写了“}”号导致条件语句执行逻辑错误,而且不易被发现,建议编程时遵守Java代码编写规范,为条件语句补全“{}”符号。
public class Test5 {
public static void main(String[] args) {
int n=10;
if(n>20)
System.out.println("n的值是"+10);
System.out.println("不属于if语句里面的内容,始终会执行这句话");
}
}
运行结果:
不属于if语句里面的内容,始终会执行这句话
switch语句
如果一个程序需要多条相似的条件判断,尤其是当布尔表达式简单并且形式相同(“变量+操作符+数值”的形式),只是判断的值不同时,可以使用if语句来进行多条判断,但是此时代码会非常臃肿,后期维护时要分别对各个条件进行测试。
switch语句是一种多分支并行语句,它允许多个分支语句并行存在,并用关键字case标识。 执行时,switch语句首先计算参数的值,如果和某一个分支语句标识的值相同,则执行该分支语句中的代码,直到关键字break为止;如果该分支语句中没有break关键字,则会继续判断后面的case分支语句,直到遇到break为止。这种现象称为case穿透。switch语句同时提供了默认执行的机制,当没有个分支语句的值与switch人参的值相同时,则会执行关键字default分支中的语句。
正常switch语句:
public class Test6 {
public static void main(String[] args) {
int i=3;
switch (i){
case 1:
System.out.println("i值为1");
break;
case 2:
System.out.println("i值为2");
break;
case 3:
System.out.println("i值为3");
break;
default:
System.out.println("i值为其他");
break;
}
}
}
运行结果:
i值为3
case穿透现象:
public class Test6 {
public static void main(String[] args) {
int i=2;
switch (i){
case 1:
System.out.println("i值为1");
case 2:
System.out.println("i值为2");
case 3:
System.out.println("i值为3");
default:
System.out.println("上面没有break,下面语句都会被执行");
}
}
}
运行结果:
i值为2
i值为3
上面没有break,下面语句都会被执行
default语句是最后执行的,所有default语句的break可以省略。