PPT注意事项: 当前PPT课件文件必须和提供的源代码文件夹“代码”在同一目录中即不要移动文件夹“代码”的默认位置。
第3章 运算符、表达式和语句 配合例子源代码一起使用 课件制作人 张跃平
导读 主要内容 重点和难点 运算符与表达式 语句概述 if条件分支语句 switch开关语句 循环语句 break和continue语句 数组与for语句 重点和难点 重点:运算符、表达式和各种控制语句 难点:各种控制语句用法
§3.1 运算符与表达式 Java提供了丰富的运算符,如算术运算符、关系运算符、逻辑运算符、位运算符等。 §3.1 运算符与表达式 Java提供了丰富的运算符,如算术运算符、关系运算符、逻辑运算符、位运算符等。 Java语言中的绝大多数运算符和C语言相同,基本语句,如条件分支语句、循环语句等也和C语言类似,因此,本章就主要知识点给予简单的介绍 。
§3.1.1 算术运算符与算术表达式 加减运算符: +,- 乘、除和求余运算符: * / % 算术表达式 §3.1.1 算术运算符与算术表达式 加减运算符: +,- 加减运算符是二目运算符;加减运算符的结合方向是从左到右;加减运算符的操作元是整型或浮点型数据,加减运算符的优先级是4级。 乘、除和求余运算符: * / % 以上运算符是二目运算符,结合方向是从左到右,乘、除和求余运算符的操作元是整型或浮点型数据。运算符的优先级是3级。 算术表达式 用算术符号和括号连接起来的符合java语法规则的式子,称为算术表达式。 如:x+2*y-30+3*(y+5)
§3.1.2 自增,自减运算符 自增、自减运算符:++,-- 例如: int f=2; §3.1.2 自增,自减运算符 自增、自减运算符:++,-- 单目运算符,可以放在操作元之前,也可以放在操作元之后。操作元必须是一个整型或浮点型变量。作用是使变量的值增1或减1,如: ++x(--x)表示在使用x之前,先使x的值增(减)1。 x++(x--)表示在使用x之后,使x的值增(减)1。 例如: int f=2; int m=2; int x=(f*m++)+m; //x=7; int y=(f*++m)+m; //y=9;
§3.1.3 算术混合运算的精度 java中数据类型的精度从“低”到“高”排列的顺序是: §3.1.3 算术混合运算的精度 java中数据类型的精度从“低”到“高”排列的顺序是: byte short char int long float double Java在计算算术表达式的值时,使用下列计算精度规则: 如果表达式中有双精度浮点数(double型数据),则按双精度进行运算. 如果表达式中最高精度是单精度浮点数(float型数据),则按单精度进行运算. 如果表达式中最高精度是long型整数,则按long精度进行运算. 如果表达式中最高精度低于int型整数,则按int精度进行运算. char型数据和整型数据运算结果的精度是int。 例如:5/2的结果是2,要想得到2.5,必须写成5.0/2或5.0f/2。 例如:byte x=7; 则执行表达式 ‘B’+x; 的结果是int型。
§3.1.4 关系运算符与关系表达式 关系运算符: > , < , >= , <= , == , != §3.1.4 关系运算符与关系表达式 关系运算符: > , < , >= , <= , == , != 特点:关系运算符是二目运算符,用来比较两个值的关系,见表4.1。 关系运算符的运算结果是boolean型,当运算符对应的关系成立时,运算结果是true,否则是false。 运算规则: 在关系运算符中,当操作数是基本数据类型时,比较的是数据内容; 在关系运算符中,当操作数是引用类型时,比较的是引用对象的引用值,判断是否是同一对象,而没有比较对象的内容。 如,4>8,(x+y)>80。
§3.1.5 逻辑运算符与逻辑表达式 逻辑运算符包括: &&、||、! 规则: &&,||也称短路运算符 §3.1.5 逻辑运算符与逻辑表达式 逻辑运算符包括: &&、||、! 其中:&&、|| 为二目运算符,实现逻辑与、逻辑或; !为单目运算符,实现逻辑非。 规则: 逻辑运算符的操作元必须是boolean型数据,逻辑运算符可以用来连接关系表达式,见表4.2。 &&,||也称短路运算符 当前面的表达式op1的值为false时,&&运算符在运算时就不再去计算op2表达式的值;当op1为true时,||运算符就不再计算op2的值。(op1&&op2;op1||op2)。
注意y的值 class Test { public static void main(String args[]) { int x,y=10; if( ((x=0)==0) || ((y=20)==20) ) { System.out.println("现在y的值是:"+y); }
§3.1.6 赋值运算符与赋值表达式 赋值运算符:= 例如:x=20; b=true; §3.1.6 赋值运算符与赋值表达式 赋值运算符:= 赋值运算符是二目运算符,左面的操作元必须是变量,不能是常量或表达式。 赋值运算符的优先级较低,是14级,结合方向右到左。 赋值表达式的值就是“=”左面变量的值。 注意:不要将赋值运算符“=”与等号逻辑运算符“==”混淆。 例如:x=20; b=true;
§3.1.7 位运算符 位运算符:是指对两个整型数据按照对应的位进行运算,结果为新的整型数据。 “按位与”运算 “按位或”运算 §3.1.7 位运算符 位运算符:是指对两个整型数据按照对应的位进行运算,结果为新的整型数据。 “按位与”运算 “&”是双目运算符。运算法则是:如果a,b两个数据对应位都是1,则c的该位是1,否则是0。 “按位或”运算 “|”是双目运算符。运算法则是:如果a,b两个数据对应位都是0,则c的该位是0,否则是1。 “按位非”运算 “~”是单目运算符。运算法则是:如果a对应位都是0,则c的该位是1,否则是1。 “按位异或”运算 “^”是双目运算符。运算法则是:如果a,b两个数据对应位相同,则c的该位是0,否则是1。
例题 例子1中利用“异或”运算的性质,对几个字符进行加密并输出密文,然后再解密。 例子1 class Example3_1 { public static void main(String args[]) { char a1='十',a2='点',a3='进',a4='攻'; char secret='8'; a1=(char)(a1^secret); a2=(char)(a2^secret); a3=(char)(a3^secret); a4=(char)(a4^secret); System.out.println("密文:"+a1+a2+a3+a4); System.out.println("原文:"+a1+a2+a3+a4); } 例子1中利用“异或”运算的性质,对几个字符进行加密并输出密文,然后再解密。 例子1
§3.1.8 instanceof 运算符 instanceof 运算符 是二目运算符,左面的操作元是一个对象;右面是一个类。当左面的对象是右面的类或子类创建的对象时,该运算符运算的结果是true ,否则是false。 例题: class Test { public static void main (String argv[]) { String s=new String(“abc”); if(s instanceof String) System.out.println(“s is a string”); B b=new B(); if(b instanceof Object) System.out.println("b is definitedly an object"); }
§3.1.9 运算符综述 Java的表达式就是用运算符连接起来的符合Java规则的式子。 运算符的优先级决定了表达式中运算执行的先后顺序。 §3.1.9 运算符综述 Java的表达式就是用运算符连接起来的符合Java规则的式子。 运算符的优先级决定了表达式中运算执行的先后顺序。 在编写程序时尽量使用括号()运算符号来实现想要的运算次序,以免产生难以阅读或含糊不清的计算顺序。 运算符的结合性决定了具有相同级别运算符的先后顺序 。
§3.2 语句概述 Java里的语句可分为以下六类 方法调用语句:如:System.out.println(" Hello"); §3.2 语句概述 Java里的语句可分为以下六类 方法调用语句:如:System.out.println(" Hello"); 表达式语句:表示式尾加上分号。比如赋值语句:x=23; 复合语句:可以用{ }把一些语句括起来构成复合语句, 如:{ z=123+x; System.out.println("How are you"); } 空语句:一个分号也是一条语句,称做空语句。 控制语句:控制语句分为条件分支语句、开关语句和循环语句。 package语句和 import语句:它们和类、对象有关,将在第4章讲解。
§3.3 if条件分支语句 if语句 if-else语句 if-else if- ……- else if -else 语句 条件分支语句按着语法格式可细分为三种形式: if语句 if-else语句 if-else if- ……- else if -else 语句
§3.3.1 if语句 if语句是单条件分支语句,即根据一个条件来控制程序执行的流程(如图3.2)。 若干语句 } 注:表达式的值必须是boolean型的;不能用0代表false;用1代表true;
例子2将变量a,b,c内存中的数值按大小顺序进行互换(从小到大排列)。 例题 public class Example3_2 { public static void main(String args[]) { int a = 9,b = 5,c = 7,t=0; if(b<a) { t = a; a = b; b = t; } if(c<a) { t = a; a = c;c = t; if(c<b) { t = b; b = c; c = t; System.out.println("a="+a+",b="+b+",c="+c); 例子2 例子2将变量a,b,c内存中的数值按大小顺序进行互换(从小到大排列)。
§3.3.2 if-else 语句 if-else 语句是双条件分支语句,即根据一个条件来控制程序执行的流程。 若干语句 } else {
例题 例子3中有两条if-else语句,其作用是根据成绩输出相应的信息,运行效果如图3.4。 例子3
§3.3.3 if-else if-else 语句 if-elseif 语句是多条件分支语句,即根据多个条件来控制程序执行的流程。 若干语句 } else if(表达式) { … … else {
多分支流程示意图
§3.4 switch开关语句 switch 语句是单条件多分支的开关语句 它的一般格式定义如下(其中break语句是可选的): { case 常量值1: 若干个语句 break; case 常量值2: ... case 常量值n: default: 若干语句 } 说明: 1)表达式的值必须是:byte,short, Int,char不能是String或者long型的; (与int兼容类型) 2)这里面必须要有break语句, 否则,就会匹配显示从匹配的常量值 到最后。 3)default语句放的位置是任意的。 4)检查时case 常量必须与switch表达式 可用的类型相同。
例子4使用了switch语句判断用户从键盘输入的正整数是否为中奖号码。 import java.util.Scanner; public class Example3_4{ public static void main(String args[]) { int number = 0; System.out.println("输入正整数(回车确定)"); Scanner reader = new Scanner(System.in); number = reader.nextInt(); switch(number) { case 9 : case 131 : case 12 : System.out.println(number+"是三等奖"); break; case 209 : case 596 : case 27 : System.out.println(number+"是二等奖"); case 875 : case 316 : case 59 : System.out.println(number+"是一等奖"); default: System.out.println(number+"未中奖"); }
§3.5 循环语句 §3.5.1 for循环语句 for语句的语法格式: for语句的执行规则是: §3.5 循环语句 §3.5.1 for循环语句 for语句的语法格式: for (表达式1; 表达式2; 表达式3) { 若干语句 } for语句的执行规则是: (1)计算“表达式1”,完成必要的初始化工作。 (2)判断“表达式2”的值,若“表达式2”的值为true,则进行(3),否则进行(4)。 (3)执行循环体,然后计算“表达式3”,以便改变循环条件,进行(2)。 (4)结束for语句的执行。
例题 例子5:计算8+88+888+8888… …的前12项和。 public class Example3_5 { public static void main(String args[]) { long sum = 0,a = 8,item = a,n = 12,I = 1; for(i=1;i<=n;i++) { sum = sum+item; item = item*10+a; } System.out.println(sum); 例子5
§3.5.2 while 循环 while语句的语法格式: while语句的执行规则是: while (表达式) { 若干语句 } (1)计算表达式的值,如果该值是true时, 就进行(2),否则执行(3)。 (2)执行循环体,再进行(1)。 (3)结束while语句的执行。
§3.5.3 do-while循环 do-while语句的语法格式: do- while语句的执行规则是: do { 若干语句 (1)执行循环体,再进行(2)。 (2)计算表达式的值,如果该值是true时, 就进行(1),否则执行(3)。 (3)结束while语句的执行。
例题 例子6用while语句计算1+1/2!+1/3!+1/4! … 的前20项 public class Example3_6 { 例子6 public static void main(String args[]) { double sum = 0,item = 1; int i = 1,n = 20; while(i<=n) { sum = sum+item; i = i+1; item = item*(1.0/i); } System.out.println("sum="+sum);
§3.6 break和continue语句 break和continue语句是用关键break或continue加上分号构成的语句。 如果在某次循环中执行了break语句,那么整个循环语句就结束。如果在某次循环中执行了continue语句,那么本次循环就结束,即不再执行本次循环中循环体中continue语句后面的语句,而转入进行下一次循环。
例题 例子7使用了continue和break语句,计算1+3+5…输出100内的素数. 例子7 public class Example3_7 { public static void main(String args[]) { int sum=0,i,j; for( i=1;i<=10;i++) { if(i%2==0) { //计算1+3+5+7+9 continue; } sum=sum+i; System.out.println("sum="+sum); for(j=2;j<=100;j++) { //求100以内的素数 for( i=2;i<=j/2;i++) { if(j%i==0) break; if(i>j/2) { System.out.println(""+j+"是素数"); 例子7使用了continue和break语句,计算1+3+5…输出100内的素数. 例子7
§3.7 for语句与数组 for(声明循环变量:数组的名字) { …… } JDK1.5后,对for语句的功能给予扩充、增强,以便更好地遍历数组。语法格式如下: for(声明循环变量:数组的名字) { …… } 其中,声明的循环变量的类型必须和数组的类型相同。这种形式的for语句类似自然语言中的“for each”语句,为了便于理解上述for语句,可以将这种形式的for语句翻译成“对于循环变量依次取数组的每一个元素的值”。
例题 例子8分别使用for语句的传统方式和改进方式遍历数组。 例子8 public class Example3_8 { public static void main(String args[]) { int a[] = {1,2,3,4}; char b[] = {'a','b','c','d'}; for(int n=0;n<a.length;n++) { //传统方式 System.out.println(a[n]); } for(int n=0;n<b.length;n++) { //传统方式 System.out.println(b[n]); for(int i:a) { //循环变量i依次取数组a的每一个元素的值(改进方式) System.out.println(i); for(char ch:b) { //循环变量ch依次取数组b的每一个元素的值(改进方式) System.out.println(ch);
3.8 应用举例 例子9中,用户在键盘依次输入若干个数字,每输入一个数字都需要按回车键确认,最后在键盘输入一个非数字字符串结束整个输入操作过程。程序将计算出这些数的和以及平均值。效果如图3.9所示。在从键盘输入数据时,经常让reader对象先调用hasNextXXX()方法等待用户在键盘输入数据,然后再调用nextXXX()方法获取用户输入的数据。 例子9
总结 1 Java提供了丰富的运算符,学会各种运算符的使用. 2 Java语言控制语句分为条件控制语句和循环控制语句.
作业 习题3: 2,3,4
本章结束 Thank You !