-----------------------------------------------------------------------------------------------------上接Java笔记Day02-----------------------------------------------------------------------------------------------------
(3)比较运算符(< > <= >= ==)
比较运算符的运算结果是一个boolean值
(4)逻辑运算符(& | ! ^ && ||)
逻辑运算符用于连接两个boolean类型的表达式。其中&&被称为双与(或短路与),||被称为双或(短路或)。&与&&的区别在于:当&或者&&连接两个boolean表达式时,如果左边表达式的值为false,&右边的表达式依然进行运算,最后根据左右表达式的结果进行与运算得出最终结果,而&&右边的表达式不再进行运算,直接得出最终结果false。同理,| 与 || 的区别在于:当 | 或者 || 连接两个boolean表达式时,如果左边表达式的值为true,| 右边的表达式依然进行运算,最后根据左右表达式的结果进行或运算得出最终结果,而 || 右边的表达式不再进行运算,直接得出最终结果true。也就是说,&&和|| 在左边表达式能决定整个表达式最终结果的时候,将不再对右边表达式进行运算,而&和 | 无论任何情况都会依次计算左右表达式的值,然后根据左右表达式的值进行运算得出整个表达式的最终结果。
(5)位运算符(& | ~ ^ << >> >>>)
位运算符直接作用于二进制位,效率高。如果想要高效率的进行数值运算,优先考虑位运算。
^ 特点:a ^ b ^ b = a
案例:不使用第三方变量,交换两个变量的值。
解决方案1:
int a = 3,b = 5;
a = a + b;
b = a - b;
a = a - b;
缺点:如果a和b数值较大,两者的和可能会超过int的数值表示范围。
解决方案2:
使用a和b的乘积,思路与方案1类似,缺点也类似。
解决方案3:
int a = 3,b = 5;
a = a ^ b;
b = a ^ b;
a = a ^ b;
(6)三元运算符格式:条件表达式 ? 表达式1 : 表达式2
其中表达式1和表达式2都要有一个确定的结果,不能类似于syso(“打印”)类似的无结果语句。
只要是运算符,就必须有结果,照该思路考虑,三元运算符也必须有结果。
6. 语句
Java程序有三种程序控制结构:顺序结构、分支结构、循环结构。其中顺序结构就是最普通的代码结构,在Java中分支结构通过 if 语句和 switch 语句实现,循环结构通过while、do while、for语句实现。
每种语句都有自己的范围,在Java当中这个范围用大括号{ }来界定,大括号所界定的部分叫做代码块。可以在花括号前面给代码块加一名字,比如if、switch、while、for,分别对应if、switch、while、for语句。当然也可以不加名字,不加名字的代码块如果在方法当中就是局部代码块,局部代码块的作用主要是控制局部变量的生命周期,当某个或者某些变量已经使用完毕,在接下来的程序运行当中不再参与运算的时候,为了及时释放这部分变量所占用的空间,可以将这部分变量的声明、初始化和使用放在局部代码块当中。
(1)if 语句
格式一:
if(条件表达式){
执行语句1;
执行语句2;
……
}
解释:只要 if 后面的小括号中的条件表达式为true,就会执行 if 所对应的大括号中的语句。
格式二:
if(条件表达式){
执行语句1;
执行语句2;
……
}else{
执行语句1;
执行语句2;
……
}
解释:只要 if 后面的小括号中的条件表达式为true,就会执行 if 所对应的大括号中的语句;否则,就会执行 else 对应的大括号中的语句。if 和 else 所对应的大括号中的语句在逻辑上是对立的,至少有一个会执行。注意:if-else 是一个整体,是一个语句。格式三:
if(条件表达式){
执行语句1;
执行语句2;
……
}else if(条件表达式){
执行语句1;
执行语句2;
……
}else{
执行语句1;
执行语句2;
……
}
解释:同格式二。不管哪种格式,if、else、else if 都只能控制所对应的大括号中的语句的执行,如果没有大括号,则只能控制紧挨着自己的一条语句的执行。注意:这里所说的一条语句有可能是一个整体,就像格式二或格式三那样的语句整体。
(2)switch 语句
格式:
switch (key) {
case value1:
执行语句1;
执行语句2;
……
break;
case value2:
执行语句1;
执行语句2;
……
break;
default:
执行语句1;
执行语句2;
……
break;}
在switch中key的类型只有int和枚举类型;而一切可以自动转换成int形的参数也可以使用,也就是说如果byte、short、char作为参数传入时是先将它们自动转化为int,再继续实现的。在switch语句中,case语句和default语句的匹配顺序是:先从上到下依次匹配case语句,匹配到就执行,如果都匹配不成功,则执行default语句,不管default语句所处的位置。对于default语句所处的位置没有硬性的规定,放到最上面都没问题。break语句在switch语句当中发挥的作用巨大,如果某个case语句或者default语句当中没写break语句,那么在执行完当前case或default语句之后,会继续执行后面的case语句,直到执行到break语句或switch语句结束。
(3)while 语句
格式:
while(条件表达式){
执行语句1;
执行语句2;
……
}
解释:while语句和 if 语句对比,在格式上唯一的区别就在于代码块的名称不一样,一个是while,一个是 if 。while是满足条件可以执行多次,if 满足条件只能执行一次。
(4)do while 语句
格式:
do{
执行语句1;
执行语句2;
……
}while(条件表达式);
解释:do-while与while的区别:while是先检查条件表达式,条件满足了才执行,然后每次循环的时候先检查条件,满足才执行;do-while不管条件满足不满足,上来先执行一遍再说,然后每次循环的时候先检查条件,满足才执行。
(5)for 语句
格式:
for(初始化表达式;条件表达式;运算表达式){
执行语句1;
执行语句2;
……
}
解释:语句执行顺序略过不谈,值得注意的是,初始化表达式部分可以一次初始化多个变量,运算表达式也可以有多个,都是以逗号隔开。for循环和while循环完全可以实现互换,只是方便不方便的问题。两者最大的区别可能就是局部变量的生命周期了。
for循环-死循环
for( ;;){
执行语句1;
执行语句2;
……
}
其中for死循环当中条件表达式部分虽然没有内容,但是编译器会默认给补全一个true。
while循环-死循环
while (true){
执行语句1;
执行语句2;
……
}