java中进制之间的转换

fhqihwcw 贡献于2011-12-16

作者 赵晓俊  创建于2010-04-14 04:31:00   修改者hp  修改于2010-04-14 04:36:00字数31712

文档摘要:数据的分类变量存储数据是有类别之分的,就如同房间分单人间和多人间,语言分汉语、日语、英语等。
关键词:

3.2  数据的分类 变量存储数据是有类别之分的,就如同房间分单人间和多人间,语言分汉语、日语、英语等。Java数据的分类如图3.2所示。 图3.2  数据的分类 数据类型主要分为基本数据类型和引用数据类型两大类。基本数据类型根据数据的不同又分为数值型和非数值型,数值型又有整型和浮点型之分,整型数据主要有byte、short、int、long,浮点型数据主要有float、double,非数值型数据主要有char和boolean。引用数据类型主要有类、接口和数组。 3.2.1  Java中的8种基本数据类型 Java中主要有8种基本数据类型,分别是byte、short、int、long、char、boolean、float、double,具体的介绍如下。 1. boolean boolean(布尔)型数据的数据值只有true和false两种。boolean类型数据适用于逻辑运算,一般用于程序流程控制,boolean类型数据只允许取值true或false,不可以用0或非0的整数替代true和false。 2. char char型(字符型)数据在内存中占用2个字节。char型数据用来表示通常意义上的字符,例如,“char c = 'A';”。Java字符采用Unicode编码,每个字符占2个字节,因而可用十六进制编码形式表示,例如,“char c1 = '\u0061';”。Java语言中还允许使用转义字符'\'来将其后的字符转变为其他的含义,例如,“char c2 = '\n';”。 3. byte byte型(字节型)数据在内存中占用1个字节,表示的存储数据范围为:-128~127。 4. short short型(短整型)数据在内存中占用2个字节,表示的存储数据范围为:-32 768~32 767。 5. int int型(整型)数据在内存中占用4个字节,表示的存储数据范围为-231~231-1。 6. long long型(长整型)数据在内存中占用8个字节,表示的存储数据范围为-263~263-1。 7. float float型(单精度浮点型)数据在内存中占用4个字节,表示的存储范围为-3.4E38~3.4E38。 8. double double型(双精度浮点型)数据在内存中占用8个字节,表示的存储范围为-1.7E308~1.7E308。 Java浮点类型常量有如下两种表示形式。 l   十进制数形式,必须含有小数点,例如,3.14、314.0、0.314等。 l   科学记数法形式,例如,3.14e2、3.14E2、314E2等。 Java中所有的基本数据类型都有固定的存储范围和所占内存空间的大小,而不受具体操作系统的影响,以保证Java程序的可移植性。整型数据默认为int数据类型,浮点型默认为double数据类型,如果要表示long型数据或float型数据就要在相应的数值后面加上l、L或f、F,所以定义一个长整型数据应这样写:“long a=19999999999999L;”,定义一个float型数据应这样写:“float b=3.324f;”,否则会出现编译问题。实际上在其他语言中如C语言中,字符型数据和整型数据是可以相互转换的,都是以ASCII码来存储,可以将字符型数据当整型数据来看待。 Java中常用的转义字符如表3.1所示。 表3.1  Java中常用的转义字符 转义字符 说  明                        \b                退格符                        \n                换行符                        \r                回车符                        \t                制表符                        \’                单引号                        \’’                双引号                        \\                反斜杠 ASCII(美国标准信息交换码)是计算机中用得最广泛的字符集及其编码,由美国国家标准局(ANSI)制定。ASCII已被国际标准化组织(ISO)定为国际标准,称为ISO 646标准。ASCII码适用于所有拉丁文字母,它有7位码和8位码两种形式。因为1位二进制数可以表示2(21)种状态:0、1;而2位二进制数可以表示4(22)种状态:00、01、10、11;以此类推,7位二进制数可以表示128(27)种状态,每种状态都唯一地编为一个7位的二进制码,对应一个字符(或控制码),这些码可以排列成一个十进制序号0~127。所以,7位ASCII码是用7位二进制数进行编码的,可以表示128个字符。第0~32号及第127号(共34个)是控制字符或通信专用字符,如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BEL(振铃)等;通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等。第33~126号(共94个)是字符,其中第48~57号为0~9共10个阿拉伯数字;65~90号为26个大写英文字母;97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。 在计算机的存储单元中,一个ASCII码值占一个字节(8个二进制位),其最高位(b7)用作奇偶校验位。所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1;偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。 3.2.2  普及二进制 1. 二进制 计算机中的数据都以二进制数字保存的。二进制计算规则是:逢二进一。即只有0、1两个值。例如,十进制的10在计算机内保存为二进制的1010。 计算机中信息的存储单位有如下几种。 l   位(bit):表示一个二进制数码0或1,是计算机存储处理信息的最基本的单位。 l   字节(Byte):一个字节由8个位组成。它表示作为一个完整处理单位的8个二进制数码。 2. 十六进制和八进制 十六进制:因为二进制表示法太冗长,所以在程序中一般喜欢用十六进制。基数为十六,逢十六进一。它用a、b、c、d、e、f表示10、11、12、13、14、15。Java中十六进制数据要以0x或0X开头。例如,0x23D十六进制转换成二进制只需将每个十六进制数字替换为相对应的4个二进制位即可。 八进制:0~7,八进制表示法在早期的计算机系统中很常见。八进制适用于位数为3的倍数的计算机系统,对于现在的位数为2的幂(8位、16位、32位与64位)的计算机系统来说,八进制就不好用了。 3. 补码知识 事实上,计算机内的二进制数值是以补码形式表示的。一个正数的补码和其原码的形式是相同的。负数的补码是将该数的绝对值的二进制形式,按位取反再加1。由此可知,二进制补码数值的最高位(最左位)是符号位:该位为0,表示数值为正数;该位为1,表示数值为负数。例如:      10的补码 00000000  00000000  00000000  00001010    -10的补码 11111111  11111111  11111111  11110110 3.2.3  进制间的转换 由于计算机中都是以二进制形式来存储数据的,那么进制间是如何相互转换的呢?进制的转换可以归为以下三类。 1. 各种进制转为十进制 其他进制数转换为十进制数的方法为:从右到左为这个数从0开始一位一位地标号,各个位上面的数乘以此进制数的标号次幂再求和,也就是“位权表示法”。如: (123.12)10=1´102+2´101+3´100+1´10-1+2´10-2 (101.10)2=1´22+0´21+1´20+1´2-1+0´2-2 (123.12)8=1´82+2´81+3´80+1´8-1+2´8-2 (12A.C)16=1´162+2´161+10´160+12´16-1 2. 十进制转为各种进制 十进制数转为其他进制数的方法是:除以此进制数取余倒排序。以十转二为例方法为:整数部分除2反序取余数、小数部分乘2顺序取整数。十进制转为其他进制的方法以此类推,例如,除8反序取余法、乘8顺序取整法,除16反序取余法、乘16顺序取整法。如:(13.3125)10=(1101.0101)2,其示意如下。 3. 其他进制之间的转换 二进制转八进制、八进制转二进制、二进制转十六进制、十六进制转二进制,一般采用“分段法”来完成转换,下面以二进制和八进制之间的互转为例进行介绍。 二进制转成八进制:以小数点为界,将二进制数整数部分从低位开始,小数部分从高位开始,每3位一组,头尾不足3位的补0,然后将各组的3位二进制数分别转换为相应的八进制数,顺序排列。如: (11111110)2=(376)8。 八进制转成二进制:将八进制数的每一位分别转换为3位二进制数并顺序排列。“二、十六互转”与“二、八互转”不同的地方就是“每四位构成一组”。如: (1101010110011.1111)2=(15263.74)8 (376)8 = (11111110)2 上述转换示意如下。 即(1101010110011.1111)2=(15263.74)8 3.2.4  基本数据类型间的转换 首先boolean类型不能转换成任何其他数据类型。 其他数据类型间的相互转换有以下两大类。 1. 自动类型转换 容量小的数据类型可以自动转换成容量大的数据类型,如:byte→short→int→long→float→double。 byte、short、int不会互相转换,它们三者在计算时会转换成int类型,如: int a=6; double b=a; 2. 强制类型转换 容量大的数据类型转换成容量小的数据类型时,要加上强制转换符,如: long l = 100L; int i = (int)l; 这样有可能造成精度降低或数据溢出,使用时要小心。 所谓的精度降低或溢出,即小数位丢掉,一般是不会出现大问题的。如果是在金融行业,这样的数据就需要特别注意,好在后面的学习过程中,Java语言为这些大数据专门提供了一些处理的类。 3.2.5  数据类型的应用实例 编写一个程序Hello2.java,输出Java课程考试最高分:98.5,输出最高分学员姓名:张三,输出最高分学员性别:男。 DataTypeDemo.java的代码如下: public class DataTypeDemo{   public static void main(String[ ] args) {        double score = 98.5;           String name = "张三";   //字符串用英文双引号引起来        char sex = '男';        // 字符用英文单引号引起来        System.out.println("本次考试成绩最高分: " + score);        System.out.println("本次考试成绩最高分学员姓名为: " + name);        System.out.println("本次考试成绩最高分学员性别为: " + sex);        //两字符串连接用"+"号   } } 输出结果为: 本次考试成绩最高分: 98.5 本次考试成绩最高分学员姓名为: 张三 本次考试成绩最高分学员性别为: 男 通过变量可以存储不同类型的数据,字符串连接用“+”运算符。 3.2.6  引用数据类型 字符型只能表示一个字符,多个字符如何表示呢?字符串型数据用于存储一串字符,表示方式是用双引号把相关的字符串引起来即可,字符数量是不受限至的。如:String a=“CSDN乐知学堂”,在本书后面的章节中将重点讲解字符串的各个应用。引用数据类型还有数组和接口,将在本书后面的章节中重点介绍,在此不多阐述。 3.3  关键字、标识符和常量 3.3.1  变量命名规范 一个变量的声明,除了规定类型外还要为此变量取个名称,这样的名称叫变量名。变量名不能随便取,要遵循一定的规范。 在Java语言中,变量的命名要符合一定的规则,主要体现在以下几点。 l   变量名的组成:变量名由任意多个字母、数字、下划线(_)或$符号组成。 l   变量名的开头:变量名的开头由字母、下划线(_)或$符号开头。 l   变量名区分大小写。 l   变量名不能是Java中的关键字。 还有一些命名的规范,如:一般变量名应该简短而且能清楚地表明变量的作用,通常变量名中第一个单词的首字母小写,其后单词的首字母大写,如:myName等。 尽管有些语言广泛使用美元符号($),但是包含美元符号($)的标识符通常并不常见。所以请读者朋友尽量避免使用,除非有特别的使用惯例或其它被迫的原因才在标识符中包含此符号。 读者可以检查下面这些变量名,其中哪些是不合法的呢? principal、$lastname、zip code、123rate、discount%、cost_price、marks_3、city、City、int。 根据命名规则可以检查出: l   zip code不合法,变量名中包含空格,不符合第一条规则的约束。 l   123rate不合法,变量名以数字开头,不符合第二条规则约束。 l   discount%不合法,变量名中包含%,不符合第一条规则的约束。 l   int不合法,变量以int命名,不符合第四条规则的约束。 3.3.2  经验之谈——变量常见错误的分析与处理 常见错误1:变量未初始化 public class ErrorDemo1{      public static void main(String[ ] args) {             String title;             System.out.println( title );// 代码错误:变量应先声明并赋初值才能使用      } } 上面代码应改为:String title=“java”; 或改写为: String title; title="java"; 在Java中局部变量一定要声明并初始化。 常见错误2:变量命名出错 public class ErrorDemo2{     public static void main(String[ ] args) {           int %hour = 18;// 变量名不能以%开头           System.out.println(%hour);     } } 上面代码定义了一个变量名为%hour的变量,根据变量的命名规则,应该将变量名改为hour才行。 常见错误3:变量名同名 public class ErrorDemo3{      public static void main(String[ ] args) {          String name = "张三";//在一个{}执行体范围内不能定义两个相同名称的变量          String name = "李四";      } } 应该将上面程序体中的代码改为: String name1 = "张三"; String name2 = "李四"; 或其他不相同的名字都可以。 变量名的命名最好有意义,也就是说命名一般不要取a、b、c、d之类的,应该命名为studentName、age等在测试代码的过程中一看就知道大概意思的变量名。 3.3.3  Java标识符命名规则 除了前面的变量命名外,Java语言中还有其他的命名标识,在编程过程中Java对包、类、方法、参数等命名时使用的字符序列称为标识符。标识符也有类似的定义规则。 l   由字母、数字、下划线(_)或美元符号($)组成。 l   不能以数字开头。 l   区分大小写。 l   长度无限制。 l   不能是Java中的保留关键字。 为方便后期测试或维护用,一般标识符命名最好有意义。 读者可以根据前面的知识判断下面哪些标识符是合法的? HelloWord、username2、user_name、_userName、$abc_123、2UserName、user#Name、Hello World。 下面程序是通过中文和英文混合取的类名。 public class Abc123中_${     public static void main(String[] args){         System.out.println("标识符");         int age;         int grad;       //定义了两个整型变量         String name;    //定义了一个字符串类型的变量     } } 在Java编程过程中,虽然Java编译器支持中文取名,但最好不要用中文,以免带来不必要的麻烦。 常见的命名习惯有:①包名一般用小写字母和少量的数字组成,比如:org、shan、dao等,最好是组织名、公司名或功能模块名;②类名和接口名一般由一个或几个单词组成,遵循“驼峰规则”。所谓的驼峰规则就是像骆驼的驼峰一样,取名一般每个单词的首字母大写,如StringBuilder;也即大驼峰规则③方法名除了第一个单词首字母小写外,其他单词都是首字母大写,与类名取名类似,如toSend。也即小驼峰规则;④属性名如果是基本数据类型的变量一般小写,引用数据类型的变量一般与类名取名类似,如“int name;”或“String PersonModel”等。只有局部变量可以简写,如“int i;”或“int j;”等。 3.3.4  关键字 在Java中被赋予特定含义,且已经被系统使用,有专门用途的字符串称为关键字(keyword)。关键字全部是小写。Java中共有50个保留的关键字,如表3.2所示。 表3.2  Java中的50个关键字 abstract boolean break byte case catch char class const continue default do double else extends final finally float for goto if implements import instanceof int interface long native new package private protected public return short static strictfp super switch synchronized this throw throws transient try void volatile while assert enum goto和const关键字没有定义用途,作为Java语言中的保留字。 3.3.5  常量 1. 什么是常量 常量是指程序中持续不变的值,它是值不能改变的数据,如整型常量123。 Java语言常量表示形式如下。 l   十进制整数:如12、-314、0。 l   八进制整数:要求以0开头,如0123表示八进制的123。 l   十六进制数:要求以0x或0X开头,如0x123。 l   浮点数(实型)常量:如3.14。 l   字符常量:如‘a’、‘\t’、‘\u0027’。 l   布尔(逻辑)常量:true、false。 l   字符串常量:如“a”、“hello world”。 l   null常量:表示对象的引用为空,不能作为基本数据类型的值使用。 2. 怎么使用常量 常量是装到变量存储空间中的数据,如: public static final int PI=3.14; 3. 常量的书写规则 Java中的常量一般采用大写字母单词命名,单词与单词之间用下划线(_)加以分割,这也符合ANSI的常量命名规则。如: static final int MIN_AGE = 100; static final String MAX_PAGE = 1000; 关键字static是指变量类实例共享此变量;final是指这个变量一旦被初始化便不可改变。它们的用法在后面的章节中会详细讲述。 3.4  运  算  符 在Java编程过程中,运算符主要包括如下几种。 l   算术运算符:+ 、 - 、 * 、 / 、 % 、 ++ 、 --。 l   赋值运算符:= 、 += 、 -= 、 *= 、 /= 、 %=。 l   关系运算符:> 、 < 、 >= 、 <= 、 == 、 !=。 l   逻辑运算符:! 、 & 、 | 、 ^ 、 && 、 ||。 l   位运算符:& 、 | 、 ^ 、 ~ 、 >> 、 << 、 >>>。 l   字符串连接运算符:+。 3.4.1  算术运算符 算术运算符主要用来进行算术计算。常用的算术运算符如表3.3所示。 表3.3  常用的算数运算符 运 算 符 描  述 示  例 结  果  +        加 5+5 10  -        减 5-4  1  *        乘 5*3 15                                                                                                                                                                   续表 运 算 符 描  述 示  例 结  果  /        除   10/3  3  %        取模(求余) 10%3  1 ++        自增(前,后) --        自减(前,后) 在表3.3中,++和--是初学者最不容易理解的两个算符运算符,一般++如果是前缀,那么先对此变量加1,再执行其他的操作;如果是后缀,则先执行其他的操作,再对此变量加1,--的作用同理。如下面ArithmeticOperatorsTest程序的代码: public class ArithmeticOperatorsTest{     /**      * @param 算术运算符号+ - * / %   ++  --      */     public static void main(String[] args) {         int a=9;         int b=5;         int c=a+b;         System.out.println("和为:"+c);         int d=a-b;         System.out.println("减为:"+d);         int e=a*b;         System.out.println("乘为:"+e);         int f=a/b;         System.out.println("除为:"+f);         int g=a%b;         System.out.println("取余数为:"+g);              //++演示         //如果是前缀:先对此变量加1,再执行其他的操作:可以是计算、赋值、输出         //int h=++a+b;//1.a=a+1; 2.h=a+b;         //System.out.println("前缀"+h);         //如果是后缀:先执行其他的操作,再对此变量加1         //int i=a+b++;//1.i=a+b 2.b=b+1;         int i=a+++b;//1.i=a+b 2.a=a+1;         System.out.println("后缀"+i);         System.out.println("b:"+a);     } } 输出结果为: 和为:14 减为:4 乘为:45 除为:1 取余数为:4 后缀14 b:10 单独学习自增或自减比较容易,下面通过一个结合例子来深入学习。 public class SelfTest{    public static void main(String[ ] args) {          int i=7;        System.out.println(++i+i+++i);   } } 该程序产生的输出结果为25。 println()方法中的表达式也即“(++i)+(i++)+i”的简写,表达式++i的值经过运算之后为8,然后i的值也递增至8,执行求和运算值为16,此时i的值再自增至9,所以最终的运算结果为25。 ++和--运算符是单目运算符。优先级比算术运算符高。 小知识:使用键盘输入字符到程序的功能 在JDK 1.5以后引入了Scanner这个类,它的方法能接收控制台上输入的字符,将其转换为相应数据类型的数据,并存储到指定的变量中。要从键盘输入信息并保存需要如下几步。 第1步  在程序开头输入“import java.util.Scanner”,表示导入键盘输入功能,系统已经写好了,只需要拿到程序中使用就可以了。 第2步  在程序执行体中输入“Scanner input=new Scanner(System.in);”。 第3步  表示输入功能初始化,如果要接收一个整型的数据就要定义一个整型的变量来接收,如:“int num1=input.nextInt();”。如果是其他类型的变量,则“=input.next***();”中的***也要改成相应的类型,如“String num2=input.nextString();”、“double num3=input.nextDouble();”等。 下面来做一个上机练习。 Exe1.java程序是通过键盘输入平均成绩求总成绩,代码如下。 import java.util.Scanner;     /**      * 通过键盘输入平均成绩,求总成绩      */ public class Exe1 {     public static void main(String[] args) {         Scanner input = new Scanner(System.in);         int i = 8;// 人数         System.out.println("请您输入平均成绩");         int avg = input.nextInt();// 输入一个平均成绩         int sum = avg * i;// 总成绩         System.out.println("总成绩为" + sum);     } } 输出结果为: 请您输入平均成绩 23 总成绩为184 一个好的编程人员是在实践中不断地成长起来的,上机练习是实践中最重要的环节。学到此处,读者可以试着编写本章的课后上机练习中变量运算符练习的各题,相信会大有收获。 3.4.2  赋值运算符 赋值运算符的作用是将一个值赋给一个变量,运算顺序从右到左,如表3.4所示。 表3.4  赋值运算符 运 算 符 描  述 示  例 结  果  =   赋值        a=3;b=2; a=3 b=2 += 加等于        a=3;b=2;a+=b;即a=a+b; a=5 b=2 -= 减等于        a=3;b=2;a-=b;即a=a-b; a=1 b=2 *= 乘等于        a=3;b=2;a*=b; a=6 b=2 /= 除等于        a=3;b=2;a/=b; a=1 b=2 %= 模等于        a=3;b=2;a%=b; a=1 b=2 +=、-=、*=、/=、%=属于复合赋值运算符,它们是赋值运算符和算术运算符的复合。 【示例1】AssignmentOperatorsTest.java 下面的代码是通过键盘动态输入两个数并将所输入的两个数赋值到对应的两个变量中,然后测试一下复合赋值运算。 import java.util.Scanner; public class AssignmentOperatorsTest {     /**      * 赋值运算符      */     public static void main(String[] args) {         //通过键盘输入两个数         Scanner input=new Scanner(System.in);//声明并赋初值         System.out.println("请输入两个运算的数:");         int a=input.nextInt();         int b=input.nextInt();         //对它们进行赋值运算符的计算+=,-=、...、/=           a+=b;//a=a+b;         //a-=b;//a=a-b;         //a/=b;         System.out.println("a+=b的值是:"+a);     } } 输出结果为: 请输入两个运算的数: 3 2 a+=b的值是:5 Scanner类是系统提供的类,只有JDK 5.0才有此功能,注意安装的环境。 【示例2】AssignmentOperatorsTest2.java 下面的代码测试复合赋值运算符的计算顺序。 public class AssignmentOperatorsTest2 {     /**      * 赋值运算符号=、+=、-=、*=、/=、%=      */     public static void main(String[] args) {         int a=8;   //赋值运算符的运算顺序是从右到左         int b=3;         int c=1;         int d=2;         c+=1;  //   c=c+1;-----c=1+1;         System.out.println(c);         c+=a;  //   c=c+a;-----c=2+8;         System.out.println(c);         d-=b;  //   d=d-b;-----d=2-3;         System.out.println(d);         a%=b;  //  a=a%b;-----a=8%3;         System.out.println(a);     } } 输出结果为: 2 10 -1 2 3.4.3  关系运算符 关系运算符的作用是比较两边的运算数,结果总是boolean型的数据。表3.5列出了常用的关系运算符。 表3.5  常用的关系运算符 运 算 符 描  述 示  例 结  果 ==        等于        4==3 false !=        不等于        4!=3  true <         小于        4<3 false >         大于        4>3  true <=        小于等于        4<=3 false >=        大于等于        4>=3  true 在关系运算中,判定运算符两边数据之间关系的结果类型为boolean型,它只有两个值,即真和假(true和false)。 下面通过练习来看一下在关系运算中如何使用boolean类型数据。 用boolean类型数据描述:学员张三的考试成绩(88.8)是否比学员李四高。程序RelationalOperatorsTest.java的实现代码如下。 import java.util.Scanner;     /**      * 演示关系运算符==、>=、<=、!=、>、<      * 关系或条件表达式计算的结果用boolean类型的变量来存储      */ public class RelationalOperatorsTest {     public static void main(String[] args) {         //编程思路:         //首先要定义一个变量来存储张三的分数         double zhangsanfenshu=88.8;         //要提示用户从控制台上输入李四的成绩,并存储到定义好的李四变量中         System.out.println("请您输入李四的分数:");         Scanner input=new Scanner(System.in);         double lisifenshu=input.nextDouble();         //比较张三和李四的分数将比较的结果存储到定义好的boolean类型的变量中         boolean jieguo=zhangsanfenshu>lisifenshu;         //条件表达式也叫关系表达式,是一个boolean类型的结果         //然后打印输出它们比较的结果         System.out.println("张三的分数高于李四的分数吗?"+jieguo);                 int a=8;         int b=9;         //boolean guo=a>b;         System.out.println("a>b   ?"+(a>=b));         System.out.println("a>=b   ?"+(a>=b));         System.out.println("ab   ?"+guo);         //要注意=与==的区别     } } 输出结果为: 请您输入李四的分数: 88 张三的分数高于李四的分数吗?true a>b   ?false a>=b   ?false a2;      boolean flag2=5<2;     System.out.println("flag1&flag2结果为:"+(flag1&flag2));     System.out.println("flag1|flag2结果为:"+(flag1|flag2));     System.out.println("flag1^flag2结果为:"+(flag1^flag2));     System.out.println("!flag2       结果为:"+(!flag2));     System.out.println("flag1&&flag2结果为:"+(flag1&&flag2));     System.out.println("flag1||flag2结果为:"+(flag1||flag2));     } } 输出结果为: flag1&flag2结果为:false flag1|flag2结果为:true flag1^flag2结果为:true !flag2       结果为:true flag1&&flag2结果为:false flag1||flag2结果为:true 3.4.5  位运算符 位运算符对两个运算数中的每一个二进制位都进行运算,位运算符分类如下。 l   按位取反 ~。 l   按位与 &。 l   按位或 |。 l   按位异或 ^。 图3.3所示为四个位运算的示例。 图3.3  位运算示例 其中~(按位取反)就是进行二进制数据取反,即0变1,1变0;&(按位与)主要是两个二进制操作数进行按位与操作时,两位都是1结果才是1,也就是两个二进制操作数如果是1&1得到的结果才为1,其他情况都为0;| (按位或)主要是两个二进制操作数如果其中一个为1结果就为1,如1 | 0 结果为1,只有两位全是0最后结果才为0;而^(按位异或)是两个二进制操作数相异,结果才为1,如1^0结果为1。一般只有计算机才去具体的进行这些二进制的计算,在编程的过程中使用的比较少。 3.4.6  移位运算符 Java 编程语言提供了两种右移位运算符和一种左移运算符,右移一位(>>)相对于除以2:左移(<<)相对于乘以2。移位运算一般是相对于二进制数据而言的,下面是移位运算的移动规则。 (1) 左移:“a<>b; ”将二进制形式的a逐位右移b位,最高位空出的b位补原来的符号位。 128 >> 1 即128/21= 64 256 >> 4 即256/24= 16 -256 >> 4 即-256/24= -16 (3) 无符号右移:“a>>>b;”将二进制形式的a逐位右移b位,最高位空出的b位补0。 图3.4所示为十进制数2227的各种移位运算示例。 图3.4  移位运算示例 此小节不需要读者深入理解,只要对移位运算符有所了解即可。 (1):移位运算符将它们右侧的操作数模32简化为int类型左侧操作数, 模64简化为long类型右侧操作数。因而, 任何int x, x >>> 32 都会导致不变的x 值, 而不是你可能预计的零。 (2):值得称赞的重要一点是: >>>运算符仅被允许用在整数类型, 并且仅对int 和long 值有效。如果用在short或byte值上, 则在应用>>>之前, 该值将通过带符号的向上类型转换被升级为一个int。有鉴于此,无符号移位通常已成为符号移位。 下面通过程序MyTest.java来实现移位运算,看看程序输出什么结果? public class MyTest {     public static void main(String[] args) {         /** 移位运算符 */         int a = 10;         int i = ~a;         int j = a >>> 3;         int k = a << 3;         int m = a >> 2;         System.out.println("i=" + i);         System.out.println("j=" + j);         System.out.println("k=" + k);         System.out.println("m=" + m);     } } 输出结果为: i=-11 j=1 k=80 m=2 3.4.7  其他运算符 1. 字符串连接运算符“+” 语句“String s="He" + "llo";”的执行结果为"Hello",“+”除了可用于字符串连接,还能将字符串与其他的数据类型相连成为一个新的字符串。如:“String s="x" + 123;”,结果为"x123"。 下面的程序StringConnect.java是通过“+”来连接两个或多个字符串的示例。 public class StringConnect{     /**      * 字符串测试      * 凡是""括起来的数据都是字符串,当使用“+”时,表示字符串的链接      */     public static void main(String[] args) {         String a="中"+"国";         System.out.println(a);         System.out.println("中"+a);         String b=3+"好";         System.out.println(b);         String c="1"+"2";         System.out.println(c);     } } 输出结果为: 中国 中中国 3好 12 2. 三目运算符?: 三目运算符就是能操作三个数的运算符,如X ? Y : Z ,X为boolean类型表达式,先计算X的值,若为true,整个三目运算的结果为表达式Y的值,否则整个运算结果为表达式Z的值。如:int score = 75; String type = score >=60 ? "及格" : "不及格"; 下面的程序TernaryOperatorsTest.java就是三目运算符的应用实例。 public class TernaryOperatorsTest {     /**      * 三目运算符      */     public static void main(String[] args) {         int a=8;         int b=9;         int c=a>b?a:b;         //首先判断a是否大于b,如果 a大于b,         //那么就将a的值作为整个三目运算的表达式的结果赋值给c         //如果a>  >>> L to R <  >  <=  >= L to R ==  != L to R & L to R ^ L to R | L to R && L to R || L to R ?: R to L =   *=   /=   %=   +=   -=   <<=   >>=   >>>=   &=   ^=   |= 【示例3】ExpressionTest.java 下面的代码是一个长表达式的运算示例。 public class ExpressionTest {     public static void main(String[] args) {         int a=3;         float b=3.5f;         double c=4.5;         double result =(++a+b)/c*b;         //一般多个表达式进行计算时,最后结果的数据类型以最大的数据类型为主         //为了计算清晰,最好是加()进行优先级的运算         System.out.println(result);     } } 输出结果为: 5.833333333333334 一般多个表达式进行计算时,最后结果的数据类型为最大的类型。如int、float类型的数据和double类型的数据进行运算时,最后计算结果的数据类型为double类型。 3.6  顺序结构和选择结构 任何一门编程语言都离不开流程控制,Java语言也不例外,一般流程控制有三种结构:顺序结构、选择结构和循环结构。本节将主要介绍顺序结构和选择结构。 3.6.1  顺序语句 其实所有的编程语言,发给计算机的命令都是按顺序一条条地执行的。比如生活中的取钱任务一般按六步操作顺序完成。这六步操作分别是:①带上存折或银行卡去银行;②取号排队;③将存折或银行卡递给银行职员并告知取款数额;④输入密码;⑤银行职员办理取款事宜;⑥拿到钱并离开银行。下面的程序SequentialStatement.java就是按顺序一步一步地完成取钱任务的。 public class SequentialStatement {     /**      * 顺序结构语句的示例      */     public static void main(String[] args) {         System.out.println("第1步:带上存折或银行卡去银行");         System.out.println("第2步:取号排队");         System.out.println("第3步:将存折或银行卡递给银行职员并告知取款数额");         System.out.println("第4步:输入密码");         System.out.println("第5步:银行职员办理取款事宜");         System.out.println("第6步:拿到钱并离开银行");     } } 上面的代码就是根据一定的顺序从main方法的{(左括号)开始到}(右括号)结束,来一行行地发送命令给计算机完成取钱的任务。 3.6.2  选择条件语句 if条件语句是根据条件判断之后再做处理,if分支结构主要有以下几种。 l   if(条件语句){…}。 l   if (条件语句){…}else{…}。 l   if (条件语句){…}else if(条件语句){…}else{…}。 l   嵌套if条件结构。 1. if结构 1. if结构   If(boolean类型表达式)        语句A;   功能:当表达式值为true时,执行语句A,否则跳过语句A。   流程图如图3.5所示。 图3.5  单条件IF结构流程图 生活中有这样类似的问题,如果我中了500万,我就买车、买房、娶媳妇,那么通过Java程序如何处理这样的呢? 下面的程序If.java是通过if结构来处理上述问题的。 import java.util.*;  //*表示所有,它包含import java.util.Scanner public class If{     public static void main(String[] args) {         int jiangjin=500;     //规定的奖金数目是500万         Scanner input=new Scanner(System.in);         System.out.println("请您输入奖金猜是否与规定的数目符合:");         int in=input.nextInt();         //条件结构         if(in==jiangjin){              System.out.println("恭喜您中500万!");              System.out.println("买车");              System.out.println("买房");              System.out.println("娶媳妇");         }     } } 输出结果为: 请您输入奖金猜是否与规定的数目符合: 500 恭喜您中500万! 买车 买房 娶媳妇 2. if…else结构   If(boolean类型表达式)        语句A;   else        语句B;   功能:当表达式值为true时,执行语句A;当表达式值为false时,执行语句B。   流程图如图3.6所示。 图3.6  双重条件IF结构流程图 如果没有中500万,那么又如何处理呢?可以通过if…else结构进行处理。程序IfElse.java就是如果我们没有中奖的处理方式。 import java.util.Scanner; public class IfElse {     public static void main(String[] args) {         int jiangjin=500;     //规定的奖金数目是500万         Scanner input=new Scanner(System.in);         System.out.println("请您输入奖金猜是否与规定的数目符合:");         int in=input.nextInt();         //条件结构         if(in==jiangjin){              System.out.println("恭喜您中500万!");              System.out.println("买车");              System.out.println("买房");              System.out.println("娶媳妇");         }else{             System.out.println("谢谢惠顾!");             System.out.println("您得继续吃方便面");             System.out.println("革命尚未成功,同志仍需努力!!!");         }     } } 输出结果为: 请您输入奖金猜是否与规定的数目符合: 400 谢谢惠顾! 您得继续吃方便面 革命尚未成功,同志仍需努力!!! 3. 多重if结构 if (boolean类型表达式) {      //语句 A } 可以有多个   else if (boolean类型表达式) {      //语句 B } 可以省略   else {      //语句 C } 功能:当表达式值为true时,执行语句A;在else部分再判断其它表达式的值,如果均不符合,则是执行语句C。 流程图如图3.7所示。 图3.7  多重条件IF结构流程图 在学生时代,父母为了激励孩子努力学习,一般会对孩子讲“如果你考了什么分数,我将给你一个什么奖励…”。小明的父母也是这么给他一个期许的。如果把生活中的这种情形用程序来演绎,前面两种做法显然是解决不了的,要处理这样的问题就需要用多重if结构。 程序IfElseIfTest.java可以实现此类分级评级,代码如下: import java.util.*; public class IfElseIfTest {     /**      * 输入小明的考试成绩,显示所获奖励      * 成绩==100分,爸爸给他买辆车      * 成绩>=90分,妈妈给他买MP4      * 90分>成绩>=60分,妈妈给他买本参考书      * 成绩<60分,什么都不买      */     public static void main(String[] args) {         Scanner input=new Scanner(System.in);         System.out.println("请您输入小明的考试成绩:");         int chengji=input.nextInt();         if(chengji==100){             System.out.println("爸爸给他买辆车");         }else if(chengji>=90&&chengji<100){             System.out.println("妈妈给他买MP4");         }else if(chengji>=60&&chengji<90){             System.out.println("妈妈给他买本参考书");         }else if(chengji<60){             System.out.println("什么都不买");         }     } } 输出结果为: 请您输入小明的考试成绩: 67 妈妈给他买本参考书 4. 嵌套if结构 if (boolean类型表达式) {      if(boolean类型表达式){ //语句 A       }else{   //语句 B } }else if (boolean类型表达式){   if(boolean类型表达式){ //语句 C       }else{   //语句 D } }else{ } 功能:当表达式值为true时,进入执行语句A;在else部分再判断其它表达式的值,如果均不符合,则是执行语句C。 流程图如图3.8所示。 图3.8  嵌套if结构图 小朱的男朋友答应她,如果他发了的奖金高于2000块,就出去庆祝一下(如果周末天气好,就去郊游,否则就带她去商场买购物);如果只发的奖金高于1000元,就简单表示一下(天气好就去公园转转,否则就去书店看书);如果发的奖金低于1000元,则就呆在家里看电视。要处理这个语句就需要用到嵌套if语句。程序NestIFDemo.java可以实现小朱男友的计划,代码如下: import java.util.Scanner; public class NestIFDemo {     public static void main(String[] args) {         Scanner input = new Scanner(System.in);         System.out.println("请输入奖金数目(整数)");         int bonus =input.nextInt();         System.out.println("请输入天气状况(1代表好,0代表差)");         int datenum =input.nextInt();                   boolean flag = (datenum==1?true:false);         if (bonus > 2000) {             if (flag) {                 System.out.println("我们去郊游");             } else {                 System.out.println("我们去购物");             }         } else if (bonus > 1000) {             if (flag) {                 System.out.println("我们去公园");             } else {                 System.out.println("我们去书店");             }         } else {             System.out.println("在家看电视");         }     } } 输出结果为: 请输入奖金数目(整数) 3000 请输入天气状况(1代表好,0代表差) 0 我们去购物 . if与else的配对 了解几种常见的条件语句用法之后,请读者朋友想一想,如果有多个不带else子句的if,会是怎么一个结果呢? 【示例4】IfelseIfTest2.java 比如,提供1至9个数据,判断数据是奇数还是偶数,然后对其分别求和,最后显示出奇数和偶数的和。 public class IfelseIfTest2{     public static void main(String[] args) {         int oddsum = 0;         int bothsum = 0;         if (args.length>1) {             for (int i = 0; i < 10; i++)                 if (i % 2 != 0)                     oddsum += i;         else             bothsum += i;         }         System.out.println("奇数的和为:" + oddsum + " 偶数的和为:" + bothsum);     } } 上面的else看起来与数组长度的判断绑定在一块儿了,但这只是缩进造成的假象,在这里这个缩进应该被忽略掉。实际上它应该和是否被2整除的条件相互绑定的。上面main方法的代码实际上应该为:     public static void main(String[] args) {         int oddsum = 0;         int bothsum = 0;         if (args.length>1) {             for (int i = 0; i < 10; i++)                 if (i % 2 != 0)                     oddsum += i;                 else                     bothsum += i;         }         System.out.println("奇数的和为:" + oddsum + " 偶数的和为:" + bothsum);     } else子句应该和离它最近的那个没有else子句的if语句绑定。 3.6.3  switch结构 除了多重if结构外,Java语言中还有一类多分支选择结构,如有下面一个问题要通过多分支选择结构来解决。 问题描述:令狐冲参加比武大会,如果获得第一名,将出任武林盟主;如果获得第二名,将出任武当掌门;如果获得第三名,将出任峨嵋掌门;否则,将被逐出师门。 上面的问题可以通过多重if结构实现,但Java语言中提供了更好的解决此类问题的方法——switch结构。 1. 什么是switch结构 switch结构也是一种类似于处理多分支选择的一种程序结构。 switch(表达式){ //计算表达式 case 取值1: 语句块1; break;  //如果表达式的值等于常量1,则执行语句块1 case 取值n: 语句块n; break;  //如果表达式的值等于常量n,则执行语句块n default: 语句块n+1; break;   //如果前面的常量都不等于,则执行default语句块 } switch结构有如下规则。 (1) 表达式的返回值必须是下述几种类型之一:char、byte、short、int,并且必须是确定的结果。 (2) case子句中的取值必须是常量,且所有case子句中的取值应该是不同的。 (3) default子句是可选的。 (4) break语句用来在执行完一个case分支后,使程序跳出switch语句块;如果case后面没有写break,则直接往下面执行。 (5) case后面的执行体可写{ },也可以不写。 switch表达式必须是整数类型(char、byte、short、int或它们对应的包装器类)或者枚举类型。在后面的章节中会再作阐述。 2. 如何使用switch结构 下面通过switch结构来描述令狐冲比武的结果。 【示例6】SwitchTestPro.java 解决比武大会问题。 public class SwitchTestPro {  public static void main(String args[]){        int mingCi = 1;        switch (mingCi){                    case 1:                        System.out.println("出任武林盟主");                        break;                    case 2:                        System.out.println("出任武当掌门");                        break;                    case 3:                        System.out.println("出任峨嵋掌门");                        break;                    default:                        System.out.println("被逐出师门");        }  } } 输出结果为: 出任武林盟主 把类型改为char,通过上例来测试switch块对char类型的支持。 public class SwitchTestPro {  public static void main(String args[]){        char mingCi = ‘a’;        switch (mingCi){                    case ‘a’:                        System.out.println("出任武林盟主");                        break;                    case ‘b’:                        System.out.println("出任武当掌门");                        break;                    case ‘c’:                        System.out.println("出任峨嵋掌门");                        break;                    default:                        System.out.println("被逐出师门");        }  } } 因为字符可以直接向int转型,所又上述代码是完全正确的。 case或default标号不会让控制流跳出switch,它们也没有暗含要结束语句执行的意思。如果要在switch块中结束语句的执行,必须显式地将控制流转出switch块。前面是通过break来做到这一点的。当然使用return语句也可以实现退出switch块的效果。 【示例7】SwitchTest.java 如果要想设计一个一星期的减肥计划,可以通过switch结构来实现,下面代码就是一个很好的示例。 import java.util.Scanner; /**  * 下面是一个膳食减肥计划  */ public class SwitchTest {     public static void main(String[] args) {         //用switch结构来实现一个减肥计划         System.out.println("请您输入星期数字:");         Scanner input=new Scanner(System.in);         int num=input.nextInt();         switch(num){           case 1:               {                 System.out.println("小白菜");                 return;               }           case 2:               System.out.println("大白菜");               return;           case 3:               System.out.println("方便面");               return;           case 4:               System.out.println("猪肉");               return;           case 5:               System.out.println("牛肉");               return;           case 6:               System.out.println("燕窝!鲍鱼");               break;           default:               System.out.println("什么也不吃");               return;         }     } } return语句会终止一个方法的执行并返回它的调用者。如果方法不需要返回值,使用简单的return语句即可。如果方法有返回类型,则return语句必须包括属于某种类型的表达式,这种类型可以赋值给返回类型。 输出结果为: 请您输入星期数字: 6 燕窝!鲍鱼 在某些环境下,还需要实现多种情况下执行同一个动作的效果,亦即多个case标号对应一条语句。 【示例8】SwitchTest1.java 比如遇上经济危机,要节省过日子,对上面的减把计划进行修改,代码如下所示。 import java.util.Scanner; /**  * 下面是一个膳食减肥计划  */ public class SwitchTest1 {     public static void main(String[] args) {         //用switch结构来实现一个减肥计划         System.out.println("请您输入星期数字:");         Scanner input=new Scanner(System.in);         int num=input.nextInt();         switch(num){ case 1:case 2:                 System.out.println("小白菜");                 break;           case 3:case 4:               System.out.println("方便面");               break;           case 5:case 6:               System.out.println("牛肉");               break;               default:               System.out.println("什么也不吃");               break;         }     } } 输出结果: 请您输入星期数字: 6 牛肉 switch语句中最多只能有一个default标号。 3.6.4  经验之谈——switch结构常见错误的分析与处理 编程初学者使用switch结构时经常会出现的一些错误,下面将常见的一些错误提出来供读者参考。 常见错误1:缺少break语句 错误代码片段如下: int mingCi = 1; switch (mingCi){ case 1:     System.out.println("出任武林盟主"); case 2:     System.out.println("出任武当掌门"); case 3:     System.out.println("出任峨嵋掌门"); default:     System.out.println("被逐出师门"); } 输出结果为: 出任武林盟主 出任武当掌门 出任峨嵋掌门 被逐出师门 错误分析:在switch结构中,每一个case语句块后面如果不写break语句,switch就会直接往下面的case语句块运行,直到遇到break语句为止。上面的代码应该在每个case语句后面都加上break语句。 常见错误2:case语句后面常量相同 错误代码片段如下: int mingCi = 1; switch (mingCi){ case 1:     System.out.println("出任武林盟主"); case 2:     System.out.println("出任武当掌门"); case 2: // 代码错误,case语句后面的常量值不能相同     System.out.println("出任峨嵋掌门"); default:     System.out.println("被逐出师门"); } 上面的代码有两个case2,当计算机选择分支的时候不能判定是哪一个,因而要将它们后面的常量改成不重复的数。 常见错误3:case语句后接常量错误 错误代码片段如下: String day = "星期一"; switch (day){ case "星期一":     System.out.println("星期一:青菜  ");     break; case "星期二":     System.out.println("星期二:鱼  ");     break; default: } 上面代码中,case语句后面接的常量值只能是byte、short、int、char类型的值,不能是其他类型的值。 3.6.5  switch和多重if结构比较 switch和多重if结构有很多相同之处,也有不同之处。 (1) 相同点:都可以实现多分支结构。 (2) 不同点:switch结构只能处理等值的条件判断,且条件是整型变量或字符变量的等值判断,一般适合分支多于5个以上的情况;多重if结构特别适合某个变量处于某个区间时的情况,如a>60&&a<=80。 3.7  循 环 语 句 循环语句的功能是在循环条件满足的情况下,反复执行特定代码。循环语句分类主要有while循环、do…while循环和for循环三类。 Java中循环结构需满足以下三个条件。 l   要初始化循环变量,如int i=0。 l   要有判断循环体是否结束的条件表达式,如:i<=100。 l   要有改变判断条件表达式值的语句,如:“i++;”。 读者只要记住这三个条件的三个关键字,理解并学会运用,循环语句就很容易掌握了。这三个关键字是“初”、“判”、“变”,分别对应上面的三个条件。 1. 为什么需要循环 如果有这样一个问题需要通过程序来解决,有一天你的女朋友要你对她说一百遍“我喜欢你”,如果按照以往的程序只能在main方法中写入下面的代码片段。 System.out.println("我喜欢你"); System.out.println("我喜欢你"); System.out.println("我喜欢你"); System.out.println("我喜欢你"); System.out.println("我喜欢你"); System.out.println("我喜欢你");     M System.out.println("我喜欢你"); 这样写一百遍是很麻烦的事情。 2. 什么是循环 生活中的循环有很多,如图3.9所示。 生活中的循环一般是通过循环条件来执行循环操作的。例如打印机打印50份试卷就是循环条件。Java语言是怎么处理循环这样的问题的呢?下面将做详细讲解。   (a) 打印50份试卷          (b) 10000米赛跑  (c) 旋转的车轮 图3.9  生活中的循环 3.7.1  while循环 1. 什么是while循环 while即当……的时候,也就是当满足条件时就循环执行指定的代码。 2. while循环的语法 while (expression) {    语句; } 其中expression也只能是boolean或Boolean类型的,它的值将首先被计算机出来,若值为true,则执行其后面的语句,一旦语句执行完毕,expression的值将会被重新计算,如果还是为true,语句将会再次执行,这样一直重复下去,直至expression的值为false为止。 下面的程序While.java通过while循环解决了说一百遍“我喜欢你”的问题。代码如下: public class While{     /**      * 通过while循环来解决你女朋友要你对她说一百遍"我喜欢你"      */     public static void main(String[] args) {         int i=1;//1.初始化         while (i <= 100) {// 2.判断条件             System.out.println("我喜欢你我已经说了" + i + "遍");             i++;// 3.更改变量值         }     } } 输出结果为: 我喜欢你我已经说了1遍 我喜欢你我已经说了2遍 我喜欢你我已经说了3遍 我喜欢你我已经说了4遍 我喜欢你我已经说了5遍 我喜欢你我已经说了6遍 我喜欢你我已经说了7遍 我喜欢你我已经说了8遍 我喜欢你我已经说了9遍 …… 我喜欢你我已经说了100遍 while循环的特点是:先判断,再执行。其具体执行流程如图3.10所示。 图3.10  while循环的流程图 3. 怎么使用while循环 简单的while循环用法就如上例所示,通过变量的自增或自减来更新值。其实循环条件除了预先设定之外,还可以由输入者自行控制,从而形成良好的人机互动效果。 【示例13】WhileTest2.java Java编程要经常练习才能获得较好的学习效果。下面是老师监督学生加强编程练习,学生通过询问老师,老师看结果后判断学生练习好了没有。这也是循环的一种方式。 import java.util.*; public class WhileTest2 {     /**      * 老师要学生加强练习,通过询问老师,让老师看结果后判断练习好了没有。      */     public static void main(String[] args) {         Scanner input = new Scanner(System.in);         System.out.println("老师,我练得怎么样?Y/N");         String result;         result = input.next();// 由老师来输入Y(Yes)或N(No) //1.初始化变量         while (!result.equalsIgnoreCase("Y")) {// 2.判断变量             System.out.println("继续练程序");             System.out.println("老师,我练得怎么样?您回答一下:Y/N");             result = input.next();// 3.更新变量值         }         System.out.println("练习结束!");     } } String字符串对象的equalsIgnoreCase方法表示忽略比较对象的大小写。有关String的相关用法在后面的章节有详细的讲解。 输出结果为: 老师,我练得怎么样?Y/N N 继续练程序 老师,我练得怎么样?您回答一下:Y/N N 继续练程序 老师,我练得怎么样?您回答一下:Y/N Y 练习结束! 3.7.2  经验之谈——while循环的常见错误 常见错误1:缺少改变循环体判断条件表达式值的语句 错误代码片段如下: public class Test {     /* 打印4次"欢迎----学员" */     public static void main(String [ ] args){         int i  = 0;         while (i < 4 ){                System.out.println("欢迎----学员");          }     } } 永远输出: 欢迎----学员 欢迎----学员 欢迎----学员 欢迎----学员 欢迎----学员 M 上面代码将形成死循环,应该在while执行体中加入改变判断条件表达式值的语句,如“i++;”。 永远都不会退出的循环称为死循环。如果不小心形成了死循环,请用“CTRL+C”退出。 常见错误2:丢失等号 错误代码片段如下: public class Test1 {     /*  打印4次"欢迎----学员" */     public static void main(String [ ] args){         int i= 1;         while (i < 4){// 题意要求循环4次,判断表达式只循环3次,应该改为i<=4           System.out.println("欢迎---学员");           i ++;         }     } } 输出结果为: 欢迎---学员 欢迎---学员 欢迎---学员 在编写循环语句的时候,经常会出现上面代码中少次数的情况。编程时一定要弄清楚循环的次数。修改时为上面代码的while判断条件表达式i<4加上一个等号(=),变为i<=4即可。 常见错误3:判断条件不对 错误代码片段如下: public class Test2 {     /* 打印4次"欢迎----学员" */     public static void main(String[] args) {         int i = 0;         while (i > 5) {             System.out.println("欢迎----学员");             i++;         }     } } 上述代码执行后,一次都没有打印输出。主要原因是判断条件i>5一次都不成立,所以while执行体一次也不执行。应该将i>5改成i<5。 3.7.3  do…while循环 1. 什么是do…while循环 do…while也是Java语言中处理循环的一种控制语句。While循环会执行零次或多次,有时候第一次计算出来的表达式值可能就是false,但还是希望循环体能执行一次,这种情况下do…while循环就该粉墨登场了。 语法为: do {         语句; } while (expression); 一般do…while循环结构是先执行一次循环体的操作,然后再判断条件是否满足。do…while循环流程图如图3.11所示。 图3.11  do…while循环的流程图 它是先执行语句,再判断表达式的值。这里通过一个简单的小例子来理解do…while的用法。比如春节回家,火车票往往是很紧张的,对于有车票的人,他们就会希望上车时执行while循环的操作,因为这样就可以避免没票的人也挤在车里。用代码描述就是: public class WhileCheckTicket{     public static void main(String[] args) {         boolean haveticket=false;//没有车票         while (haveticket){             System.out.println("我上车了");         }     } } 而对于没有车票的人可能更希望执行do…while操作,因为可以先上车再补票嘛。修改main方法中的代码,如下所示。     public static void main(String[] args) {         boolean haveticket=false;         do{             System.out.println("我上车了");         } while (haveticket);     } 2. 怎么使用do…while循环 前面通过while循环来解决女朋友要你对她说一百遍“我喜欢你”的任务,这里还可以用do…while操作来实现相同的功能。代码如下: public class DoWhileTest{     /**      * 通过Dowhile循环来解决你女朋友要你对她说一百遍"我喜欢你"      */     public static void main(String[] args) {         int i=100;//1.初始化          do{             System.out.println("我喜欢你我已经说了" + i + "遍");             i++;// 3.更改变量值         } while (i <= 100); // 2.判断条件     } } do…while循环结构在编程过程中相对运用较少,需要注意的是,在do{…}while();结构后面千万不要丢了分号(;),这是经常出现的编程错误。 3. while和do…while的区别 while和do…while主要有以下两个不同点: (1) 语法不同:while循环结构是先判断后执行;do…while循环结构是先执行后判断。当初始情况不满足循环条件时,while循环一次都不会执行,而do…while循环不管任何情况都至少执行一次。 (2) do…while循环结构后面有分号,while循环结构后面没有分号,编程时一定要注意。 3.7.4  for循环 1. 什么是for循环 for循环也是Java语言中一种处理循环的编程结构。一般程序员比较习惯用for循环。 语法为: for(初始化循环变量;判断循环体是否结束的条件表达式;改变判断条件表达式值的语句){     循环体; } for循环的语法中包括四个部分:①初始化循环变量;②判断循环体是否结束的条件的表达式;③改变判断条件表达式值的语句;④循环体。其中初始化循环变量只会执行一次。然后每次都计算条件表达式的值,如果该值为true,则执行循环体的内容,更新循环变量的值,然后再重新计算条件表达式的值,这个循环会不断地重复,直到条件表达式的值为false为止。for循环的语法结构与while和do…while循环结构的区别是它将三个条件全部写到括号内,如: for (int i = 0 ; i < 100 ; i++) {      System.out.println("我最棒"); } 上述代码先执行一次“int i=0;”来初始化变量。读者朋友要注意的是这三个条件并不是必需的,在后面的示例中会对此进行解释。 2. 怎么使用for循环 【示例15】程序ForTest.java通过for循环 可以使用基本的for语句对一定范围内的值从头到尾的进行循环,下面通过for循环实现动态输出0~10的整数来了解它的这一用法。其代码如下: public class ForTest {     /**      * 动态输出0~10的数      */     public static void main(String[] args) {         for(int i=0;i<=10;i++){             System.out.println("数" + i);         }     } } 输出结果为: 数0 数1 数2 …… 数9 数10 2. for循环替换while循环 前面曾用while循环实现了女朋友要求你说100遍“我喜欢你”的问题,如果用for循环对其进行修改,是否可行?代码清单如下所示: 【示例14】For.java public class For {     / * 你的女朋友要你说十遍"我喜欢你"      */     public static void main(String[] args) {         // for循环写法         for(int i=1;i<=100;i++){             System.out.println("我喜欢你我已经说了" + i + "遍");         }     } } 输出结果为: 我喜欢你我已经说了1遍 我喜欢你我已经说了2遍 我喜欢你我已经说了3遍 我喜欢你我已经说了4遍 我喜欢你我已经说了5遍 我喜欢你我已经说了6遍 我喜欢你我已经说了7遍 我喜欢你我已经说了8遍 …… 我喜欢你我已经说了100遍 for一般用于已知循环次数的情况,而while用于循环次数不确定的情况。 3. for循环中多表达式的运用 for循环中的初始化和更新部分可以是一组用逗号分隔的表达式,与大多数操作符的操作数类似,这些用逗号分隔的表达式将会从左到右地进行计算。如用一种新的思路来输出1-10之间的数字。设置两个变量,分别从右至左和从左至右移动取值,当两变量值的位置互换时,移动停止。此过程如图3.12所示。 图3.12  两边移动效果图 实现上述效果的代码如下所示。 public class DoubleExpressionDemo{     public static void main(String[] args) {         for(int i=1,j=10;j>=i;i++,j--){                System.out.println(i+" "+j);             }     } } 输出结果为: 0       20 1       19 2       18 3       17 4       16 5       15 6       14 7       13 8       12 9       11 10      10 两边迭代取值的效果已经完成,可结果中却有两个数字10,如何消去一个数字10呢?请先阅读for循环与if条件语句的组合运用的相关内容,然后再来解答。 4. for循环与if条件语句的组合运用 前面都只是用for循环来完成一些简单的功能。下面通过一个示例来讲解for循环与if条件语句的组合运用。编写一个程序,求1~10之间不能被3整除的数之和(使用for循环结构)。要判断一个数能否被整除,主要看被除数与除数取模得到的结果是否为0,如果为0表示能被整除,如果不为0表示不能被整除。代码如下: 【示例16】ForTest1.java public class ForTest1 {     /**      * 求1~10之间不能被3整除的数之和 (使用for循环结构)      */     public static void main(String[] args) {         int sum=0;         for(int i=1;i<=10;i++){             if(i%3!=0){                 sum=sum+i;                 System.out.print("不能被3整除的数为:"+i);             }             System.out.println();         }         System.out.println("不能被3整除的数的和为:"+sum);     } } 输出结果为: 不能被3整除的数为:1 不能被3整除的数为:2 不能被3整除的数为:4 不能被3整除的数为:5 不能被3整除的数为:7 不能被3整除的数为:8 不能被3整除的数为:10 不能被3整除的数的和为:37 5. for循环间的嵌套运用 为了加强对for循环的理解,可以使用for循环的嵌套应用打印出一些简单的数学图形,比如要显示一个边长由用户随意指定,用“*”表示的正方形图案,代码该如何编写呢? import java.util.Scanner; public class ForDemo{ public static void main(String[] args) {     Scanner input=new Scanner (System.in);     System.out.print("请输一个值:");     int in=input.nextInt();     for(int i=0;i3”。 常见错误3:没有改变循环体结束的条件表达式值的语句 错误代码片段如下: for(int i=0;i<10;){     System.out.println("这是 "+i);      } 编译通过,但没有改变循环体结束的条件表达式值的语句,造成死循环。应该在循环体中加入改变循环体结束的条件表达式值的语句。如i++。 常见错误4:没有满足循环的三个条件 错误代码片段如下: for(;;){     System.out.println("这是测试"); } 编译通过,因为表达式全部省略,所以无条件判断,循环变量无改变,应在循环体内设法结束循环,否则会造成死循环,应该将三个条件加上。 3.7.6  循环语句小结 需要多次重复执行一个或多个任务的问题可以使用循环语句来解决。到目前为止本书所讲的循环结构有while、do…while和for循环。 下面通过相应的代码来演示各种循环结构的执行顺序。 1. while循环结构 示例代码如下: int i=0;  //1.初始化循环变量 int sum=0; while( i<10 ){  //2.判断循环体是否结束的条件表达式     sum=sum+i;      i++;  //3.改变判断条件表达式值的语句 } 代码中的1、2、3标号的语句是满足while循环的三个条件,while循环结构的执行顺序是:1—2—3—2—3—…。 2. do…while循环结构 示例代码如下: int i=0;  //1.初始化循环变量 int sum=0; do{     sum=sum+i;      i++;  //3.改变判断条件表达式值的语句 }while(i<10);   //2.判断循环体是否结束的条件表达式 do…while循环结构执行的顺序是:1—3—2—3—2—3—2—… 3. for循环结构 示例代码如下: int sum=0;                                                        for( int i=0 /*1.初始化*/; i<10; /*2.判断*/ i++ /*3.改变*/){//多行注释可以写到      //任何地方 sum=sum+i;//4.执行体 } for循环结构执行的顺序是:1—2—4—3—2—4—3—2—4…。 while和for循环结构相同,先进行判断,后执行循环体的内容;而do…while循环结构则是先执行循环体内容,后进行判断,循环体至少执行一次。

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 15 金币 [ 分享文档获得金币 ] 5 人已下载

下载文档