第03章表达式和流程控制.doc_第1页
第03章表达式和流程控制.doc_第2页
第03章表达式和流程控制.doc_第3页
第03章表达式和流程控制.doc_第4页
第03章表达式和流程控制.doc_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第三章 表达式和流程控制 本模块讨论变量、运算符和算术表达式并列出不同的管理运行程序路径的控制结构。 第一节 相关问题 讨论下列问题与本模块阐述的论题相关。- 什么类型的变量对程序员有用(例如,其它语言的程序员想了解Java编程语言是如何定义和处理全局变量和局部变量的) ?- 复合类可以有同名的变量吗?如果可以,它们的作用域有多大?- 列出用于其它语言的控制结构;一般语言都采用什么方法进行流程控制和中断流程(如在循环或开关语句中) ?第二节 目 标 完成本模块的学习后,你应该能够:- 区分实例变量和局部变量;- 描述实例变量是如何被初始化的;- 确认并更正编译器错误;- 辨认、描述并使用Jav

2、a软件运算符;- 区分合法和非法原始类型赋值;- 确认boolean表达式和它们在控制构造中的要求;- 辨认赋值兼容性和在基本类型中的必要计算;- 使用if, switch,for,while和do句型结构和break和continue的标号形式作为程序中的流程控制结构。第三节 表达式3.3.1 变量和作用域变量和作用域- 局部(local)变量是在一个方法内定义的变量, 也被称作自动(automatic)、临时(temporary)或栈(stack)变量- 当一个方法被执行时, 局部变量被创建;当一个方法被终止时, 局部变量被清除- 局部变量必须使用之前初始化, 否则编译时将出错 你已经看到

3、了两种变量的描述方法:原始类型变量和引用类型变量。你也看到了变量被声明的位置:在方法内(方法是面向对象的术语,它可引用函数或子程序,例如:main()或在方法外但在类定义之内。变量也可被定义为方法参数或构造函数参数。 在方法内定义的参数被称为局部(local)变量,有时也被用为自动(automatic)、临时(temporary)或栈(stack)变量。 在方法外定义的变量是在使用new Xxxx ()调用构造一个对象时被创建。在构造一个对象时,可创建两种变量。一是类变量,它是用static关键字来声明的;只要需要对象,类变量就将存在。二是实例变量,它不需用static关键字来声明;只要对象被

4、当作引用,实例变量就将存在。实例变量有时也被用作成员变量,因为它们是类的成员。 方法参数变量定义在一个方法调用中传送的自变量,每次当方法被调用时,一个新的变量就被创建并且一直存在到程序的运行跳离了该方法。当执行进入一个方法时,局部变量被创建,当执行离开该方法时,局部变量被取消。因而,局部变量有时也被引用为“临时或自动”变量。在成员函数内定义的变量对该成员变量是“局部的”,因而,你可以在几个成员函数中使用相同的变量名而代表不同的变量。 该方法的应用如下所示:class OurClass int i; / instance variable of class OurClass int firstM

5、ethod() int j=0; / local variable / both i and j are accessible from / this point . return 1; / end of firstMethod() int secondMethod(float f) /method parameter int j=0; /local variable. Different from the / j defined in firstMethod(). / Scope is limited to the body of / secondMethod(). / Both i(ins

6、tance variable of the / class OurClass) and j (local / variable of this method) are / accessible from this point. . return 2; / end of secondMethod() / end of class OurClass3.3.2 变量初始化在Java程序中,任何变量都必须经初始化后才能被使用。当一个对象被创建时,实例变量在分配存储器的同时被下列值初始化:byte 0 short 0 int 0 long 0L float 0.0f double 0.0d char u

7、0000 (NULL) boolean false All reference types Null 注意 一个具有空值的引用不引用任何对象。试图使用它引用的对象将会引起一个异常。异常是出现在运行时的错误,这将在模块7“异常”中讨论。在方法外定义的变量被自动初始化。局部变量必须在使用之前做“手工”初始化。如果编译器能够确认一个变量在初始化之前可被使用的情形,编译器将报错。public void doComputation() int x = (int)(Math.random() * 100);int y;int z;if (x 50) y = 9;z = y + x; / Possible

8、use before initialization3.3.3 运算符Java软件运算符在风格和功能上都与C和C+极为相似。表3-1按优先顺序列出了各种运算符(“L to R”表示左到右结合,“R to L”表示右到左结合) Separator () ; , R to L + - + - ! (data type) L to R * / % L to R + - L to R L to R = instanceof L to R = != L to R & L to R L to R | L to R & L to R | R to L ?: R to L = *= /= %= += -= =

9、= &= = |= 注意instanceof是Java编程语言特有的运算符,将在模块5“对象和类”中讨论3.3.4 逻辑表达式逻辑表达式支持的位运算符如下:!NOT &ANDXOR OR布尔运算符如下: Complement(取反) &AND XOR OR多数Java运算符是从其它语言借取得并且和人们一般期待的功能一样。关系和逻辑运算符返回布尔结果,int到boolean不能自动转换。 int i = 1; if ( i ) /generates a compile error if (i !=0) / Correct支持的位运算符是!、&、, 支持的布尔逻辑运算符是NOT、AND、XOR和O

10、R。每个运算都返回布尔结果。运算符&和是运算符&和的布尔等价物。布尔逻辑运算符将在下一页中讨论。3.3.5 位运算Java编程语言支持整数数据类型的位运算,它们的运算符、&、和分别表示位运算的NOT(为求反)、位AND、位XOR和位OR。移位运算符将稍后在本课程中讨论。3.3.6 布尔逻辑运算符布尔逻辑运算符l 运算符是&(AND)和(OR)l 运算符使用举例: 见3-11页程序运算符& (定义为AND)和(定义为OR)执行布尔逻辑表达式。请看下面的例子:MyDate d = null;if (d! = null) & (d,day() 31) / do something with d形成i

11、f ()语句自变量的布尔表达式是合法且安全的。这是因为当第一个子表达式是假时,第二个子表达式被跳过,而且当第一个子表达式是假时,整个表达式将总是假,所以不必考虑第二个子表达式的值。类似的,如果使用运算符,而且第一个表达式返回真, 则第二个表达式不必求值,因为整个表达式已经被认为是真。3.3.7 用加号(+)进行串链接用加号(+)进行串链接运算符 + 能够:l 进行String链接l 生成一个新的String例如: String salutation = Dr. ; String name = Jack + Arthur; String title = salutation + name; 最后

12、一行的结果是: Dr. Jack Arthur一个自变量必须是String对象非串被自动转换为String对象运算符 + 能够进行String对象的链接并生成一个新的String: String salutation = Dr. ; String name = Jack + Arthur; String title = salutation + name; 最后一行的结果是: Dr. Jack Arthur如果+运算符中有一个自变量为String对象,则其它自变量将被转换成String。所有对象都可被自动转换成String,尽管这样做的结果可能是意义含糊的。不是串的对象是通过使用toStrin

13、g() 成员函数而转换成串的等价物的。3.3.8 右移位运算符和右移位运算符和算术或符号右移位如下所示:见3-13页l 在移位的过程中, 符号位被拷贝逻辑或非符号右移位运算符()l 作用于位图l 在移位的过程中, 符号位不被拷贝Java编程语言提供了两种右移位运算符运算符进行算术或符号右移位。移位的结果是第一个操作数被2的幂来除,而指数的值是由第二个数给出的。例如:128 1 gives 128/2 1 = 64256 4 gives 256/2 4 = 16-256 4 gives -256/2 4 = -16逻辑或非符号右移位运算符主要作用于位图,而不是一个值的算术意义;它总是将零置于最重

14、要的位上。例如:1010 . 2 gives 111010 .1010 . 2 gives 001010 .在移位的过程中, 运算符使符号位被拷贝。注意移位运算符将它们右侧的操作数模32简化为int类型左侧操作数, 模64简化为long类型右侧操作数。因而, 任何int x, x 32都会导致不变的x值, 而不是你可能预计的零。注意-值得称赞的重要一点是: 运算符仅被允许用在整数类型, 并且仅对int和long值有效。如果用在short或byte值上, 则在应用之前, 该值将通过带符号的向上类型转换被升级为一个int。有鉴于此,无符号移位通常已成为符号移位。3.3.9 左移位运算符()左移位运

15、算符() 128 1 等于 128*21 = 256 16 2 等于 16*22 =64 运算符执行一个左移位。移位的结果是:第一个操作数乘以2的幂,指数的值是由第二个数给出的。例如: 128 1 gives 128*21 = 25616 2 gives 16*22 =643.3.10 类型转换类型转换l 如果赋值的信息丢失,程序员必须采用类型转换的方法确认赋值l 在short和char之间的赋值需要一个显式转型见3-16程序在赋值的信息可能丢失的地方,编译器需要程序员用类型转换(typecast)的方法确认赋值。例如,它可以“挤压”一个long值到一个int变量中。显式转型做法如下:long

16、 bigValue =99L;int squashed =(int) (bigValue); 在上述程序中,期待的目标类型被放置在圆括号中,并被当作表达式的前缀,该表达式必须被更改。一般来讲,建议用圆括号将需要转型的全部表达式封闭。否则,转型操作的优先级可能引起问题。 注意重温short的范围是:-215至215-1;char的范围是:0至215-1。因而在short和char之间的赋值总需要一个显式转型3.3.11 升级和表达式的类型转换升级和表达式的类型转换- 变量被自动升级为一个较长的形式(如:int至long的升级)- 如果变量类型至少和表达式类型一样大(位数相同),则表达式是赋值兼容

17、的。当没有信息丢失时,变量可被自动升级为一个较长的形式(如:int至long的升级) long bigval = 6; / 6 is an int type, OK int smallval = 99L; / 99L is a long, illegal double z = 12.414F; / 12.414F is float, OK float z1 = 12.414; / 12.414 is double, illegal一般来讲,如果变量类型至少和表达式类型一样大(位数相同),则你可认为表达式是赋值兼容的。对 + 运算符来说,当两个操作数是原始数据类型时,其结果至少有一个int,并且

18、有一个通过提升操作数到结果类型、或通过提升结果至一个较宽类型操作数而计算的值,这可能会导致溢出或精度丢失。例如:short a,b,ca=1;b=2;c= a+b;上述程序会因为在操作short之前提升每个short至int而出错。然而,如果c被声明为一个int,或按如下操作进行类型转换: c = (short)(a+b);则上述代码将会成功通过。第四节 分支语句分支语句if, else语句 if (布尔表达式) 语句或块; if (条件为真) 语句或块; else 语句或块; 条件语句使部分程序可根据某些表达式的值被有选择地执行。Java编程语言支持双路if和多路switch分支语句。3.4

19、.1 if, else语句if, else语句的基本句法是: if (布尔表达式) 语句或块; else 语句或块; 例:int count; 1.count = getCount(); / a method defined in the program 2.if (count 0) 3.System.out.println(Error: count value is negative.); 4.else 5.System.out.println(There will be + count + 6. people for lunch today.); 7.在Java编程语言中,if ()用的是

20、一个布尔表达式,而不是数字值,这一点与C/C+不同。前面已经讲过,布尔类型和数字类型不能相互转换。因而,如果出现下列情况:if (x) / x is int你应该使用下列语句替代:if (x ! = 0)全部else部分是选择性的,并且当测试条件为假时如不需做任何事,else部分可被省略。3.4.2 switch语句分支语句 switch语句 switch语句的句法是: switch (expr1) case expr2: statements; break; case expr3: statements; break; default: statements; break; switch语句

21、的句法是: switch (expr1) case expr2: statements; break; case expr3: statements; break; default: statements; break; 注意在switch (expr1) 语句中,expr1必须与int类型是赋值兼容的;byte, short或char类型可被升级;不允许使用浮点或long表达式。当变量或表达式的值不能与任何case值相匹配时,可选缺省符(default)指出了应该执行的程序代码。如果没有break语句作为某一个case代码段的结束句,则程序的执行将继续到下一个case,而不检查case表达式

22、的值。例1: 1.switch (colorNum) 2.case 0: 3.setBackground(Color.red); 4.break; 5.case 1: 6.setBackground(Color.green); 7.break; 8.default: 9.setBackground(Color.black); 10.break; 11.例2:1.switch (colorNum) 2.case 0: 3.setBackground(Color.red); 4.case 1: 5.setBackground(Color.green); 6.default: 7.setBackgr

23、ound(Color.black); 8.break; 9.例2设定背景颜色为黑色,而不考虑case变量colorNum的值。如果colorNum的值为0,背景颜色将首先被设定为红色,然后为绿色,再为黑色。第五节 循环语句循环语句 for语句 for (init_expr; boolean testexpr; alter_expr) statement or block 循环语句使语句或块的执行得以重复进行。Java编程语言支持三种循环构造类型:for, while和do loops。for和while循环是在执行循环体之前测试循环条件,而do loops是在执行完循环体之后测试循环条件。这就

24、意味着for和while循环可能连一次循环体都未执行, 而do loops将至少执行一次循环体。3.5.1 for循环for循环的句法是: for (init_expr; boolean testexpr; alter_expr) statement or block 例如: for (int i = 0; i 10; i+) System.out.println(Are you finished yet?);System.out.println(Finally!);注意Java编程语言允许在for () 循环结构中使用逗号作为分隔符。 例如,for (i= 0, j = 0; j10; i+

25、, j+)是合法的;它将i值初始化为零,并在每执行完一次循环体后,增加一次它们的值。 3.5.2 while循环循环语句 while循环 while (布尔表达式) 语句或块 while循环的句法是: while (布尔表达式) 语句或块 例如:int i = 0;while (i 10) System.out.println(Are you finished yet?); i+; System.out.println(Finally!); 请确认循环控制变量在循环体被开始执行之前已被正确初始化,并确认循环控制变量是真时,循环体才开始执行。控制变量必须被正确更新以防止死循环。 3.5.3 do

26、循环循环语句 do/while语句 do 语句或块; while (布尔测试)do循环的句法是: do 语句或块; while (布尔测试)例如:int i = 0;do System.out.println(Are you finished yet?); i+; while (i 10); System.out.println(Finally!);象while循环一样,请确认循环控制变量在循环体中被正确初始化和测试并被适时更新。作为一种编程惯例,for循环一般用在那种循环次数事先可确定的情况,而while和do用在那种循环次数事先不可确定的情况。第六节 特殊循环流程控制特殊循环流程控制l break 标注;l continue标注;l label: 语句;/ where statement must be any / legal statement.下列语句可被用在更深层次的控制循环语句中:l break 标注;l continue标注;l label: 语句;/ where statement must be any / legal statement.break语句被用来从switch语句、loop语句和预先给定了label的块中退出。continu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论