1、博学谷——让IT教学更简单,让IT学习更有效 第二章 Java编程基础 案例2-1 定义不同类型的变量 一、案例描述 1、 考核知识点 编 号:00102005 名 称:变量的定义及其数据类型 2、 练习目标 Ø 了解变量的定义方式 Ø 掌握如何为不同类型的变量赋值 3、 需求分析 变量用于存储程序运行期间的一些数据。为了加深初学者对变量的认识,本案例针对八种基本数据类型,分别定义了八个变量,并进行赋值操作。 4、 设计思路(实现原理) 1)编写一个类Example01。 2)在Example01的main()方法中,针对八种基本数据类型,分别定义变量并赋值。
2、 3)使用println语句打印变量的值。 二、案例实现 定义Example01类,其代码如下: class Example01{ public static void main(String[] args) { //定义字节变量 byte b = 12; System.out.println(b); //定义短整型变量 short s = 1234; System.out.println(s); //定义整数变量 int i = 12345; System.out.println(i); //定义长整型变量 lo
3、ng l = 12345678912345L; System.out.println(l); //定义单精度类型(7-8位的有效数字) float f = 12.5F; System.out.println(f); //定义双精度类型(15-16位的有效数字) double d = 12.5; System.out.println(d); //定义字符类型 char c = 'a'; //重新赋值,Java中的字符采用的编码是Unicode编码。占用2个字节。 c = '中'; System.out.println(c);
4、 //定义布尔类型 boolean flag = true; System.out.println(flag); } } 运行结果如图2-1所示。 图2-1 运行结果 三、案例总结 1、Java对变量的数据类型有严格的限定。在定义变量时必须声明变量的类型,并且变量值的类型和变量类型必须一致,否则程序会报错。 2、byte类型的变量存储的值必须是-27 ~ 27-1之间的整数。赋值的时候,尽量不要超出范围,如果超出可能损失精度。 3、定义变量的方式有两种,具体如下: 方式一: 数据类型 变量名 = 初始化值; 方式二: 数据类型
5、 变量名; 变量名 = 初始化值; 案例2-2 变量的自动类型转换 一、案例描述 1、 考核知识点 编 号:00102006 名 称:变量的类型转换 2、 练习目标 Ø 了解变量进行自动类型转换的条件 3、 需求分析 变量的自动类型转换,指的是两种数据类型在转换的过程中不需要显式地进行声明。为了明确哪些数据类型可以实现自动转换,本案例演示的是将一种数据类型的值赋给另外一种数据类型变量的情形。 4、 设计思路(实现原理) 1) 编写一个类Example02。 2) 在类Example02中,定义byte类型的变量a,int类型的变量b,float类型的变量
6、f,double类型的变量d,其中,变量a的初始值为10,变量f的初始值为12.5f。 3) 将变量a的值赋给变量b,变量a、b、f相加后的结果值赋给变量d。 4) 使用println语句打印出变量b和变量d的值。 二、案例实现 定义Example02类,其代码如下: class Example02 { public static void main(String[] args) { //隐式转换 byte a = 10; int b = a; float f = 12.5F; System.out.println(b); d
7、ouble d = a+b+f; System.out.println(d); } } 运行结果如图2-2所示。 图2-2 运行结果 三、案例总结 1、要实现自动类型转换,必须同时满足两个条件,第一是两种数据类型彼此兼容,第二是目标类型的取值范围大于源类型的取值范围。 2、列出三种可以进行自动类型转换的情况,具体如下: (1)整数类型之间可以实现转换,如byte类型的数据可以赋值给short、int、long类型的变量,short、char类型的数据可以赋值给int、long类型的变量,int类型的数据可以赋值给long类型的变量。 (2)整数类型转换为float
8、类型,如byte、char、short、int类型的数据可以赋值给float类型的变量。 (3)其它类型转换为double类型,如byte、char、short、int、long、float类型的数据可以赋值给double类型的变量。 案例2-3 变量的强制类型转换 一、案例描述 1、 考核知识点 编 号:00102006 名 称:变量的类型转换 2、 练习目标 Ø 掌握不同数据类型间的强制类型转换 3、 需求分析 强制类型转换也叫显式类型转换,指的是两种数据类型之间的转换需要进行显式地声明。例如,两种类型彼此不兼容,或者目标类型取值范围小于源类型,都需要进行强制类型转
9、换。为了明确两种不同类型的变量如何进行强制类型转换,本案例以int和byte类型为例,演示如何将int类型的变量强转为byte类型。 4、 设计思路(实现原理) 1) 编写一个类Example03 2) 在Example03中的main()方法中定义一个int类型的变量i和byte类型的变量b,并将变量i的值赋给变量b 3) 使用println语句打印出变量b的值 二、案例实现 定义Example03类,其代码如下: class Example03 { public static void main(String[] args) { int i = 10;
10、byte b = (byte)i; System.out.println(b); } } 运行结果如图2-3所示。 图2-3 运行结果 三、案例总结 1、强制类型转换,具体格式如下: 目标类型 变量 = (目标类型)值 2、在对变量进行强制类型转换时,会发生取值范围较大的数据类型向取值范围较小的数据类型的转换,如将一个int类型的数转为byte类型,这样做极容易造成数据精度的丢失。int在内存中占用4个字节。byte类型的数据在内存中占用1个字节,当将变量i的数据在内存中占的内存大于1个字节时,前面3个高位字节的数据会丢失,数值也会发生改变。 案例2-4 变
11、量的作用域 一、案例描述 1、 考核知识点 编号:00102007 名称:变量的作用域 2、 练习目标 Ø 了解变量的作用域 3、 需求分析 在程序中,变量一定会被定义在某一对大括号中,该大括号所包含的代码区域便是这个变量的作用域。为了让初学者熟悉变量的作用域,本案例将在三层的大括号内分别定义三个变量x、y、z,用输出语句输出变量的值,观察变量的作用域。 4、 设计思路(实现原理) 1)编写一个类Example04 2)在main方法下定义变量x,并在每一层大括号内都使用一次x,观察x的作用域 3)在第一层括号内定义变量y,并在第二层括号内使用y,观察y的作用域
12、4)在第二层括号内定义z,并在第一层括号内使用z,观察z的作用域 二、案例实现 (1)定义Example04类,具体代码如下所示: public class Example04 { public static void main(String[] args) { int x = 12; { int y = 96; { int z = 0; y = x;
13、} System.out.println("x is " + x); System.out.println("y is " + y); z = x; System.out.println("z is " + z); } System.out.println("x is " + x); } } 运行结果如图2-4所示。 图2-4 运行结果 (3)对上述代码进行修改,修改后的代码如下所示: public class Example04 {
14、 public static void main(String[] args) { int x = 12; { int y = 96; { int z = 0; y = x; System.out.println("z is " + z); } System.out.println("x is " + x)
15、 System.out.println("y is " + y); } System.out.println("x is " + x); } } 运行结果如图2-5所示。 图2-5 运行结果 三、案例总结 1、第一次程序编译错误是因为程序在变量z的作用域外进行访问,所以程序找不到变量z。如果在变量z的作用域内访问z,程序就会编译成功。 2、x定义在main方法下,所有main方法下的任何位置都能够使用变量x。 3、y定义在第一层括号下,因为第二层括号在第一层括号内,所以在第二层括号内使用
16、变量y也不会报错。 案例2-5 算术运算符 一、案例描述 1、 考核知识点 编号:00102008 名称:算术运算符 2、 练习目标 Ø 了解算术运算符的用法 3、 需求分析 在程序中,经常会使用算术运算符进行四则运算,为了让初学者熟悉算术运算符的用法,本案例将以++、--、\等运算符为例,讲解不同算术运算符的作用。 4、 设计思路(实现原理) 1)编写一个类Example05 2)在main方法下定义变量a,并赋值为2,定义变量b,并赋值为4; 3)首先运算表达式++a+b++,并把计算结果赋给变量x,然后将b/a的值赋给变量y; 4)输出变量a、b、x和y
17、的值 二、案例实现 public class Example05 { public static void main(String[] args) { int a = 2; int b = 4; int x = ++a + b--; int y=b/a; System.out.println("a=" + a); System.out.println("b=" + b); System.out.println("x=" + x); System.out.println("x=" + y); } } 运行结果如图2-6所示。 图2-6 运行结果 三、案
18、例总结 1、在进行自增(++)和自减(--)的运算时,如果运算符(++或--)放在操作数的前面则是先进行自增或自减运算,再进行其它运算。反之,如果运算符放在操作数的后面则是先进行其它运算再进行自增或自减运算。 2、在进行除法运算时,当除数和被除数都为整数时,得到的结果也是一个整数。如果除法运算有小数参与,得到的结果会是一个小数。 案例2-6 赋值运算符 一、案例描述 5、 考核知识点 编号:00102009 名称:赋值运算符 6、 练习目标 Ø 了解赋值运算符的用法 7、 需求分析 在程序中,经常会使用赋值运算符, 它的作用就是将常量、变量或表达式的值赋给某一个变量
19、为了让初学者熟悉赋值运算符的用法,本案例将以+=运算符为例,讲解赋值运算符的作用。 8、 设计思路(实现原理) 1)编写一个类Example06 2)在main方法下定义变量s,并赋值为5,定义变量i,并赋值为12; 3)使用赋值运算符计算s+=i++的值,并把计算结果赋给变量s 4)输出变量s的值 二、案例实现 public class Example06 { public static void main(String[] args) { short s = 5; int i = 12; s += i++; System.out.println
20、"s = " + s); } } 运行结果如图2-7所示。 图2-7 运行结果 三、案例总结 1、在赋值过程中,运算顺序从右往左,将右边表达式的结果赋值给左边的变量。 2、在Java中可以通过一条赋值语句对多个变量进行赋值,具体示例如下: int a, b, c,d; a = b = c = d = 5; // 为四个变量同时赋值 案例2-7 比较运算符 一、案例描述 1、 考核知识点 编号:00102010 名称:比较运算符 2、 练习目标 Ø 了解比较运算符的用法 3、 需求分析 在程序中,经常会使用比较运算符对两个变量
21、或值进行比较,使用比较运算符的比较结果是一个布尔类型的值。为了让初学者熟悉比较运算符的用法,本案例将以==、>=、<=、!=比较运算符为例,讲解比较运算符的用法。 4、 设计思路(实现原理) 1)编写一个类Example07 2)在main方法下定义变量x、y,并依此赋值为0、1; 3)使用==运算符比较字符'a' == 97,输出运算结果; 4)使用>=运算符比较'a' >= 100,输出运算结果; 5)使用<=运算符比较x <= y,输出运算结果; 6)使用!=运算符比较x != y,输出运算结果; 二、案例实现 public class Example07 { pu
22、blic static void main(String[] args) { int x = 0; // 定义变量x,初始值为0 int y = 1; // 定义变量y,初始值为0 System.out.println('a' == 97); //判断字符a是否等于97 System.out.println('a' >= 100); //判断字符a是否大于100 System.out.println(x <= y); //判断x是否小于等于y System.out.println(x != y); //判断x是不是不等于y } } 运行结果
23、如图2-8所示。 图2-8 运行结果 三、案例总结 1、使用比较运算符计算的表达式,返回的结果是一个布尔类型的值 2、不能将比较运算符“==”误写成赋值运算符“=”。 案例2-8 逻辑运算符 一、案例描述 1、 考核知识点 编 号:00102011 名 称:逻辑运算符 2、 练习目标 Ø 了解逻辑运算符的运算规则 Ø 掌握如何使用逻辑运算符进行逻辑运算 3、 需求分析 逻辑运算符用于对布尔型的数据进行操作,其结果仍是一个布尔型。为了加深初学者对逻辑运算符的印象,本案例定义一个变量x,使用逻辑运算符连接表达式x>1和x<5,通过运行结果分析逻辑运算符的运算规则
24、 4、 设计思路(实现原理) 1) 编写一个类Example08 2) 在main方法下定义变量x,其初始值为3 2)使用逻辑运算符连接两个布尔型的表达式x>1和x<5 3)使用println语句输出运算结果 二、案例实现 定义Example08类,其代码如下: class Example08 { public static void main(String[] args) { int x = 3; System.out.println(x>1 & x<5); System.out.println(x<1 | x<5); System.o
25、ut.println(x>1 ^ x>5); System.out.println(!(x<1)); } } 运行结果如图2-9所示。 图2-9 运行结果 三、案例总结 在使用逻辑运算符的过程中,需要注意以下几个细节: 1、逻辑运算符可以针对结果为布尔值的表达式进行运算。如:x > 3 && y != 0。 2、运算符“&”和“&&”都表示与操作,当且仅当运算符两边的操作数都为true时,其结果才为true,否则结果为false。当运算符“&”和“&&”的右边为表达式时,两者在使用上还有一定的区别。在使用“&”进行运算时,不论左边为true或者false,右边的表达
26、式都会进行运算。如果使用“&&”进行运算,当左边为false时,右边的表达式不会进行运算,因此“&&”被称作短路与。 3、运算符“|”和“||”都表示或操作,当运算符两边的操作数任何一边的值为true时,其结果为true,当两边的值都为false时,其结果才为false。同与操作类似,“||”表示短路或,当运算符“||”的左边为true时,右边的表达式不会进行运算。 4、运算符“^”表示异或操作,当运算符两边的布尔值相同时(都为true或都为false),其结果为false。当两边布尔值不相同时,其结果为true。 案例2-9 位运算符 一、案例描述 1、 考核知识点 编 号:
27、00102012 名 称:位运算符 2、 练习目标 Ø 了解位运算符的运算规则 Ø 掌握使用位运算符进行逻辑运算 3、 需求分析 位运算符是针对二进制数的每一位进行运算的符号,它是专门针对数字0和1进行操作的。请使用不同的位运算符对十进制的3和4进行运算。 4、 设计思路(实现原理) 1) 将十进制3和4换算成二进制数 2) 使用不同的位运算符对3和4进行位运算 3) 编写一个类Example09 4) 在main方法下输出3和4进行不同的位运算后的结果 5)对比运算结果,判断运算是否正确 二、案例实现 1、将3和4换算成二进制数:3的二进制为00000011;4
28、的二进制为00000100 2、&:位与运算: 00000100 & 00000011 ————————— 00000000 所以,4&3=0 3、|:位或运算符 00000100 | 00000011 ————————— 00000111 所以,4 | 3=7 4、^:异或运算符 00000100 ^ 00000011 —————————
29、00000111 所以,4 ^ 3=7 5、~:按位取反 00000011 ~:11111100 原码:1 1111100 反码:1 0000011 补码:1 0000100 所以:~3=-4 6、<<:左移 00000011 <<2 ————————— 00001100 所以:3<<2=12 7、定义Example07类,其代码如下: class Example09 { public static void main(String[] args) { System.
30、out.println(4&3); System.out.println(4|3); System.out.println(4^3); System.out.println(~3); System.out.println(3<<2); } } 运行结果如图2-10所示。 图2-10 运行结果 由此可见,二进制位运算与程序运算的结果一致。 三、案例总结 Java中的位运算符以及其范例如下Error! Reference source not found.所示。 运算符 运算 范例 结果 & 按位与 0 & 0 0 0 & 1
31、 0 1 & 1 1 1 & 0 0 | 按位或 0 | 0 0 0 | 1 1 1 | 1 1 1 | 0 1 ~ 取反 ~0 1 ~1 0 ^ 按位异或 0 ^ 0 0 0 ^ 1 1 1 ^ 1 0 1 ^ 0 1 << 左移 00000010<<2 00001000 10010011<<2 01001100 >> 右移 01100010>>2 00011000 11100010>>2 11111000 >>> 无符号右移 01100010>>>2 00011000 11…11100010>
32、>>2 0011…111000 案例2-10 运算符的优先级 一、案例描述 1、 考核知识点 编号:00102013 名称:运算符的优先级 2、 练习目标 Ø 掌握运算符之间的优先级 3、 需求分析 当使用不同的运算符进行运算时,应该按照一定的顺序进行运算,即根据运算符的优先级进行运算。为了让初学者掌握运算符的优先级,本案例将通过表达式的运算,讲解运算符的优先级。 4、 设计思路(实现原理) 1) 编写一个类Example10 2) 在main方法中定义两个int型变量x和y 3) 将表达式3>2*x?x++:--x赋值给y 4) 用输出语句分别输出变量
33、x和y的值 二、案例实现 定义Example10类,其代码如下: class Example10 { public static void main(String[] args) { int x=1; int y=0; y=3>2*x?x++:--x; System.out.println(x); System.out.println(y); } } 运行结果如图2-11所示。 图2-11 运行结果 三、案例总结
34、 1、本案例中表达式的运算过程如下所示: 1) 在表达式y=3>2*x?x++:--x;中赋值运算符=的优先级最低,所以要先运算=右侧的表达式; 2) ?:为三元运算符,该运算符的优先级较低,要先运算?前面的表达式。 3) *的优先级比>的高,所以3>2*1为true。按照三元运算符的运算规则表达式等价于y=x++ 4) x++的++在后面,所以要先进行其它运算再自增,最后结果为x=2,y=1 2、下表列举了Java中运算符的优先级,数字越小优先级越高。 优先级 运算符 1 . [] () 2 ++ -- ~ ! (数据类型) 3 * / %
35、4 + - 5 << >> >>> 6 < > <= >= 7 == != 8 & 9 ^ 10 | 11 && 12 || 13 ?: 14 = *= /= %= += -= <<= >>= >>>= &= ^= |= 2、其实没有必要去刻意记忆运算符的优先级。由于运算符“()”的优先级最高,编写程序时,尽量使用括号“()”来实现想要的运算顺序,以免产生歧义。 案例2-11 if条件语句 一、案例描述 1、 考核知识点 编号:00102014 名称:if条件语句 2、 练习目标 Ø 掌握if条件
36、语句的语法格式 Ø 了解if条件语句的执行流程 3、 需求分析 if…else if…else语句用于对多个条件进行判断,进行多种不同的处理。为了让初学者掌握if…else if…else语句的用法,本案例将使用if…else if…else语句实现判断某月是哪个季节的功能。 设计思路(实现原理) 1)编写一个类Example11 2)定义一个变量month用于存储月份。 3)用if条件语句,判断这个月份在哪一个季节并输出结果,如:春季是3、4、5月,夏季是6、7、8月,秋季是9、10、11月,冬季是12、1、2月 4)由于一年只有12个月,所以要过滤除1-12以外的月份
37、值 二、案例实现 定义Example11类,其代码如下: class Example11 { public static void main(String[] args) { int month = 3; if(month == 3 || month == 4 || month == 5) { System.out.println(month+"月是春季"); } else if(month == 6 || month == 7 || month ==8) { System.out.println(month+"月是夏季")
38、 } else if(month == 9 || month == 10 || month ==11) { System.out.println(month+"月是秋季"); } else if(month == 1 || month == 2 || month ==12) { System.out.println(month+"月是冬季"); } else { System.out.println("没有这个月份"); } } } 运行结果如图2-12所示。 图2-12 运行结果
39、三、案例总结 1、f…else if…else语句用于对多个条件进行判断,进行多种不同的处理。if…else if…else语句具体语法格式如下: if (判断条件1) { 执行语句1 } else if (判断条件2) { 执行语句2 } ... else if (判断条件n) { 执行语句n } else { 执行语句n+1 } if…else if…else语句的执行流程如图2-13所示。 图2-13 流程图 2、因为一年只有12个月,所以当month>12时是不符合逻辑的数据,这时会打印“没有这个月份”。在编程过程中,经常要考虑程序在实际环境下
40、是否符合逻辑需求。 3、“||”表示或操作,当运算符两边的操作数任何一边的值为true时,其结果为true,当两边的值都为false时,其结果才为false。所以只要符合三个条件中的一个就会被判断为这个季节。 案例2-12 switch条件语句 一、案例描述 1、 考核知识点 编号:00102015 名称:switch条件语句 2、 练习目标 Ø 熟悉switch条件语句的语法格式 Ø 了解switch条件语句的特点 3、 需求分析 switch 条件语句也是一种很常用的选择语句,和if条件语句不同,它只能针对某个表达式的值作出判断,从而决定程序执行哪一段代码。为了让初
41、学者熟悉switch 条件语句,本案例将使用switch 条件语句实现判断选择题对错的功能。 4、 设计思路(实现原理) 1)编写一个类Example12 2)定义一个变量answer用于存储答案选项 3)用switch条件语句判断如果变量answer为B则正确,其它则错误 4)如果变量answer不等于ABCD四个选择则打印“不存在此选项” 二、案例实现 定义Example12类,其代码如下: class Example12 { public static void main(String[] args) { char answer = '
42、B'; switch(answer) { case 'A': System.out.println("A错误"); break; case 'B': System.out.println("B正确"); break; case 'C': System.out.println("C错误"); break; case 'D': System.out.println("D错误"); break; default: System.out.println("不存在
43、此选项"); } } } 运行结果如图2-14所示。 图2-14 运行结果 三、案例总结 1、switch语句的执行流程是:根据表达式的值查找与其匹配的项,如果有匹配项,则执行该匹配项下面的语句。如果没有匹配项,就会执行default后面的语句。 2、switch关键字后括号内的表达式可以是byte,short,int,char四种类型;在JDK5以后表达式可以是枚举;在.JDK7以后表达式可以是字符串。 3、switch语句只适合判断若干值的情况,不适合判断范围。 4、if和switch都可以判断值的情况,这时应该使用switch语句,因为switch的效率比
44、if语句高。 案例2-13 while循环语句 一、案例描述 1、 考核知识点 编号:00102016 名称:while循环语句 2、 练习目标 Ø 掌握while循环语句的语法格式和使用 Ø 了解while循环语句的特点 3、 需求分析 while语句会反复地进行条件判断,只要条件成立,{}内的执行语句就会执行,直到条件不成立,while循环才会结束。为了让初学者熟悉while语句,本案例将使用while语句实现统计1-10以内奇数的功能。 4、 设计思路(实现原理) 1)编写一个类Example13 2)定义一个变量x为1,用while语句循环条件为x<=10
45、 3)在while循环中,使用表达式x%2判断是否为奇数,如果为奇数,则变量count的值加1。 二、案例实现 定义Example13类,其代码如下: class Example13 { public static void main(String[] args) { int x = 1; int count; count = 0; while(x<=10) { if(x%2==1) { count++; System.out.println(x); } x++;
46、 } System.out.println("count="+count); } } 运行结果如图2-15所示。 图2-15 运行结果 三、案例总结 1、while循环语句和条件判断语句有些相似,都是根据条件判断来决定是否执行大括号内的执行语句。区别在于,while语句会反复地进行条件判断,只要条件成立,{}内的执行语句就会执行,直到条件不成立,while循环结束。 2、while循环的执行流程如图2-16所示。 图2-16 流程图 案例2-14 for循环语句 一、案例描述 1、 考核知识点 编号:00102017 名称:for循环语句
47、 2、 练习目标 Ø 掌握for循环语句的语法格式和使用 Ø 了解for循环语句的特点 3、 需求分析 for循环语句是最常用的循环语句,一般用在循环次数已知的情况下。为了让初学者熟悉for循环语句,本案例将使用for循环语句计算1+2+3+4+5...+100表达式的结果 4、 设计思路(实现原理) 1)编写一个类Example14 2)在该类中定义一个变量sum来存储每次循环整数相加的和。 3)在for循环语句中定义变量x,循环条件为x<=100 二、案例实现 定义Example14类,代码如下所示: class Example14 { pub
48、lic static void main(String[] args) { int sum = 0; for(int x = 1 ; x <= 100 ; x++) { sum = sum + x; } System.out.println("sum=" +sum); } } 程序编译时发生了错误,结果如图2-17所示。 图2-17 编译结果 三、案例总结 1、在for循环中,for关键字后面()中包括了三部分内容:初始化表达式、循环条件和操作表达式,它们之间用“;”分隔,{}中的执行语句为循环体。 2、通过序号来具体分析f
49、or循环的执行流程。具体如下: for(① ; ② ; ③){ ④ } 第一步,执行① 第二步,执行②,如果判断结果为true,执行第三步,如果判断结果为false,执行第五步 第三步,执行④ 第四步,执行③,然后重复执行第二步 第五步,退出循环 案例2-15 for循环嵌套 一、案例描述 1、 考核知识点 编号:00102018 名称:循环嵌套 2、 练习目标 Ø 掌握循环嵌套的使用和执行顺序 3、 需求分析 在编程过程中,经常需要双重循环或多重循环,这就需要循环语句的嵌套。最常见的循环嵌套就是在for循环中嵌套for循环。为了
50、让初学者熟悉for循环嵌套的使用,本案例将演示如何用for循环嵌套打印由“*”组成的直角三角形。具体要求如下: l 第一个三角形为倒直角三角形,共5行,第一行5个 “*”,一行减少一个,第5行一个“*” l 将倒直角三角形上下翻转为正直角三角形,第一行1一个“*”,第5行5个“*” 4、 设计思路(实现原理) 1) 分析第一个三角形的打印,外层for循环控制行数,初始化表达式从0开始,循环条件为小于5;第一行是5个“*”所以应该内层循环打印5次,初始化表达式从0开始,循环条件为小于5。同理,内层的循环初始化和条件如下所示: 0 1 2 3 4 1






