1.1. 流程控制
1.1.1. 顺序语句
顾名思义,就是程序从上到下一行一行执行的结构。
单独一个 ; 叫空语句。
例:
System.out.println(‘a’);;
相当于
System.out.println(‘a’);
;
错误:
System.out.print(a);
int a =1;
1.1.2. 分支语句
代码运行时需要依赖一个条件。
分支语句共三种
if语句
if…else…语句
switch语句
if语句
格式:
if(表达式){
条件表达式为真时执行的语句序列;
}
表达式只要满足值为boolean型的数据即可,如:关系表达式、逻辑表达式、布尔类型的变量或常量、true和false
如果语句序列只有一句执行语句,大括号{}可省略。
例:
int num=0;
if(num>=0)
num++;
System.out.println(num);//1
int num=0;
if(num<0)
num++;
System.out.println(num);//0
int num=0;
if(num>=0);
num++;
System.out.println(num);//1
注意看这道题:
int num=0;
if(num++<0);
num++;
System.out.println(num);//2
顺序语句要看清楚有没有分号,这是面试题中可能会出现的陷阱,千万不要说加了一个分号语法错了。
if…else…语句
语法结构:
if(条件表达式){
条件表达式为真时执行的语句序列
}else{
条件表达式为假时执行的语句序列
}
可以有if没else,光有else没有if绝对不可以!
例:
if(true);{.....}
else{....}
补充一点:
当if...else语句执行的结果是为同一个变量赋值,且执行语句都只有一句话时,可以使用三目运算完美替代。
例:int num = -33;
int res = num>=0 ? num : -num;
switch语句
有列举、分组的情况,用switch很好。
语法格式:
switch(变量){
case 值1:语句序列; [break;]
case 值2:语句序列; [break;]
case 值3:语句序列; [break;]
default:语句序列
}
语法特点:switch语句一旦与某个值匹配成功后,将执行对应的语句和余下所有的语句,直到遇到break语句,跳出。
注意,不要混淆case与elseif。elseif是一旦匹配就不再执行后面的else语句,而case语句只是相当于定义了一个标签位置
,switch一旦碰到了第一次case匹配,程序就会跳转到这个标签位置,开始顺序执行以后所有的程序代码,而不管后面的case
条件是否匹配,后面case条件下的所有代码都将被执行,知道碰到break语句为止。
switch语句可以用于比对的变量类型(6种)
byte、short、int、char(都有整数表现形式)
JDK6.0 枚举
JDK7.0 String
而且,switch()接受匹配类型的表达式,如:switch(age/10)
思考:switch为什么不接受long类型呢?
答:因为long类型数据太长,比对情况太多。
switch依赖于break,强行改变程序流程,这种设计是我们所反感的,因为程序讲究逻辑性、顺序性、完整性。
然而有人利用这个特性做了一些事情:
int month = 9;
switch(month){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: System.out.println(month+"月有31天");break;
case 4:
case 6:
case 9:
case 11: System.out.println(month+"月有30天");break;
case 2: System.out.println(month+"月有28天");break;
default : System.out.println("月份输入错误");
}
switch语句面试中的考点:
int a = 4;
switch(a){
case 1: System.out.println(1);
default : System.out.println("default");
case 2: System.out.println(2); break;
case 3: System.out.println(3);
打印结果:
default
2
default语句定义了所有case都不满足的情况下执行的语句,无论default处于何处,并且default语句沿用switch语句的break退出语句结构的特点。
1.1.3. 循环语句
循环语句不难写,真正难写的是循环体部分。
循环语句有三种结构
for
while
do…while
for语句
已知次数循环,且内存上比while略优
语法格式:
for(语句1;条件表达式;语句2){
语句3;
}
for语句的执行顺序是
语句1→条件表达式→语句2 →语句3 →条件表达式…
拓展一:
语句1处要么执行语句,可以写多句,中间使用逗号分隔。
要么写声明语句,可以声明多个变量,但要保持类型相同。
语句3处,可以写多句执行性句,中间用逗号隔开
例:
for(int i,i;;){}//int i是声明语句,而且声明了多个变量
for(int i,double b;;)// 错!类型不一致
int i=1;for(i++,i++;;)// i++执行性语句
for(int i=0;;i++,i++)//多句执行性语句,用逗号隔开
for(System.out.print(‘a’);System.out.print(‘a’);false;)//编译失败,false,JAV虚拟机不运行通过
boolean b= fasle;for(System.out.print(‘a’),System.out.print(‘a’);b;)//结果ab,注意两条输出语句之间是用,做分隔符的。
拓展二:无限循环
for(;;){}
for(;true;){}
无限循环不能停止,所以后面不能写语句,但是可以使用if结构欺骗JVM使其编译通过。
if(true){
for(;;)
}
S.o.p(“123”);//这个程序运行起来就永远在那里跳闪。
JVM认为,if语句不一定执行,所以编译能够通过,但是实际中,永远运行不到S.o.p(“123”);
拓展三:循环嵌套
要求至少会打印99乘法表,高级加行号、竖线、行线。
面试题一:
打印100以内的偶数
错误做法:for(int i=0;i<=100;i=i+2)
System.out.println(i);
这种做法是错误的,这么做是在改题,这是人脑和PC合成出来的,不是计算机的思维
正确做法:循环着对1到100对所有数进行判断,是偶数→打印,这才是计算机思维。
面试题二:
100以内,逢7(N)过酒令
class Demo6{
public static void main(String[] args){
for(int i=1;i<=100;i++)
if(i%7==0||i%10==7||i/10==7)
System.out.println('过');
else
System.out.println(i);
}
}
这样打印结果不好看,优化一下代码。去掉ln,print(“过\t”)、print(i+”\t”)
for(int i=1;i<=100;i++)
if(i%7==0||i%10==7||i/10==7)
System.out.print("过\t");
else
System.out.print(i+"\t");
那么,思考,3位数以内、4位数、5位数以内的过酒令。
while
未知次数循环
先判断while中的表达式结果是否为true,true则执行循环体,执行结束之后再次判断,如果表达式结果为false则跳出循环。
打印三位数以内的水仙花数:
int i=100;
while(i<=999){
int a =i/1%10;
int b=i/10%10;
int c=i/100%10;//全都转化到个位,然后取模
if(a*a*a+b*b*b+c*c*c==i){
System.out.println(i);
}
i++
do...while
先执行一次循环体,然后判断while中的表达式,如果是true继续执行,如果是false则跳出循环。
注意while();末尾的分号不要遗漏。
continue、break
continue:跳过当前循环,继续执行下一次循环
break:结束循环,跳转到循环语句结束的大括号处,执行大括号后的内容(所以有语句跳转的功能)
注意加标号的break使用,必须要求被控制的循环包裹着break语句。并列在前或在后皆不可,可以简单理解为,前:都运行完了控制干什么。后:还没运行到呢怎么控制。(这些东西以后基本上用不到)