第3章 运算符、表达式与语句 本章导读 1、算术运算符和算术表达式 2、关系运算符与关系表达式 3、逻辑运算符与逻辑表达式 第3章 运算符、表达式与语句 本章导读 1、算术运算符和算术表达式 2、关系运算符与关系表达式 3、逻辑运算符与逻辑表达式 4、赋值运算符与赋值表达式 5、移位运算符 6、位运算符 7、条件运算符
本章导读 8、instanceof 运算符 9、一般表达式 10、语句概述 11、分支语句 12、循环语句 13、跳转语句
3.1 算术运算符和算术表达式 加减运算符(+、-) 结合性是从左到右 双目运算符,操作元是整型或浮点型数据 优先级是4级 3.1 算术运算符和算术表达式 加减运算符(+、-) 结合性是从左到右 双目运算符,操作元是整型或浮点型数据 优先级是4级 乘、除和求余运算符(*、/、%) 5%2.2 优先级是3级
自增、自减运算符 (++、- -) 都是单目运算符,操作元必须是一个整型或浮点型变量(不能是常量或表达式),作用是使变量的值增1或减1。 运算符的优先级是2级。 运算符可以放在操作元之前(前置式),也可以放在操作元之后(后置式)。 int x=5; int y=x++; int x=5; int y=++x; int x=5; int y=x--; int x=5; int y=--x;
用算术符号和操作元连接起来的符合Java语法规则的式子,称为算术表达式。 x+2*y-30+3*(y+5) -12+n+(--n) 算术混合运算的精度 精度从“低”到“高”排列的顺序是: byte short int long float double Java将按运算符两边的操作元的最高精度保留结果的精度。 5/2的结果是2。 要想得到2.5,必须写成5.0/2或5.0f/2。 char型数据和整型数据运算结果的精度是int。 返回
3.2 关系运算符与关系表达式 关系运算符用来比较两个值的关系,关系运算符的运算结果是boolean型数据,当运算符对应的关系成立时,运算结果是true,否则是false。 大小关系运算符(>、>=、<、<=) 双目运算符,操作元是数值型的常量、变量或表达式。 运算符的优先级是6级。 等与不等关系(==、!=) 都是双目运算符,运算符的级别是7级。 关系表达式 结果为数值型的变量或表达式可以通过关系运算符形成关系表达式。 返回
3.3 逻辑运算符与逻辑表达式 逻辑运算用来实现boolean型数据的逻辑“与”、“或”和“非”运算,运算结果是boolean型数据。 3.3 逻辑运算符与逻辑表达式 逻辑运算用来实现boolean型数据的逻辑“与”、“或”和“非”运算,运算结果是boolean型数据。 逻辑“与”和逻辑“或”(&&、||) 是双目运算符,操作元是boolean型的变量或求值结果是boolean型数据的表达式。 “&&”和“||”的级别分别是11和12级,结合性是左到右。 逻辑运算符“&&”和“||”也称做短路逻辑运算符。 op1&&op2 op1||op2
结果为boolean型的变量或表达式可以通过逻辑运算符形成逻辑表达式。 24>18&&4<0 x!=0||y!=0 逻辑“非”(!) 是单目运算符,操作元在左面。 “!”的运算级别是2级,结合性从右到左。 逻辑表达式 结果为boolean型的变量或表达式可以通过逻辑运算符形成逻辑表达式。 24>18&&4<0 x!=0||y!=0 返回
3.4 赋值运算符与赋值表达式 赋值运算符(= ) 赋值运算符是双目运算符;优先级较低,是14级;结合方向右到左。 3.4 赋值运算符与赋值表达式 赋值运算符(= ) 赋值运算符是双目运算符;优先级较低,是14级;结合方向右到左。 左面的操作元必须是变量(左值),不能是常量或表达式。 赋值表达式 用赋值运算符和操作元连接起来的符合Java语法规则的式子,称为赋值表达式 赋值表达式的值就是“=”左面变量的值。 “=” “==” 返回
3.5 移位运算符 移位运算符用来对二进制位进行操作,分为左移位操作(<<)和右移位操作(>>) 3.5 移位运算符 移位运算符用来对二进制位进行操作,分为左移位操作(<<)和右移位操作(>>) 都是双目运算符,左面的操作元称作被移位数,右面的操 作数称作移位量,操作元必须是整型类型的数据 a<<n; a>>n; a是被移位数,n是移位量。
左移位运算符(<<) a<<n运算的结果是通过将a的所有位都左移n位,每左移一个位,左边的高阶位上的0或1被移出丢弃,并用0填充右边的低位 对于byte或short型数据,a<<n的运算结果是int型精度。运算时,计算系统首先将a升级为int型数据(对于正数将高位用0填充;负数用1填充), 然后再进行移位。 byte a=-8; a<<2; 1111,1000 1111,1111,1111,1111,1111,1111,1111,1000 1111,1111,1111,1111,1111,1111,1110,0000 即得到-25
例如:a<<33的计算结果与a<<1相同 在进行a<<n运算时,如果a是byte、short或int型数据,系统总是先计算出n%32的结果m,然后进行a<<m运算。 例如:a<<33的计算结果与a<<1相同 对于long型数据,系统总是先计算出n%64的结果m,然后进行a<<m运算 右移位运算符(>>) a>>n运算的结果是通过将a的所有位都移右n位,每右移一个位,右边的低阶位上的0或1被移出丢弃,并用0或1填充左边的高位 byte a=9; a>>2; 0000,1001 0000,0000,0000,0000,0000,0000,0000,1001 0000,0000,0000,0000,0000,0000,0000,0010 返回 (例3-1) 即得到2。
例3-1 Example3_1.java import java.util.*; public class Example3_1{ public static void main (String args[ ]){ Scanner reader=new Scanner(System.in); System.out.println("输入待移位的int型整数:"); int x = reader.nextInt(); System.out.println("输入移位量:"); int n = reader.nextInt(); System.out.println("左移位的结果:"+(x<<n)); System.out.println("右移位的结果:"+(x>>n)); } 输出结果: 输入待移位的int型整数: 3 输入移位量: 2 左移位的结果:12 右移位的结果:0
3.6 位运算符 包括“按位与”运算符(&)、 “按位或”运算符(|)、“按 位非”运算符(~)、“按位异或”运算符(^) 3.6 位运算符 包括“按位与”运算符(&)、 “按位或”运算符(|)、“按 位非”运算符(~)、“按位异或”运算符(^) “&”、 “|”、 “^”是双目运算符,对两个整型数据a、b 按位进行运算,运算结果是一个整型数据c;如果b的精 度高于a,那么结果c的精度和b相同 “~”是单目运算符,对一个整型数据a按位进行运算,运 算结果是一个整型数据c
“&”运算法则是:如果a、b两个数据对应位都是1,则c的 该位是1,否则是0 “~”运算法则是:如果a对应位是0,则c的该位是1,否则 是0 例3-2 返回
例3_2 Example3_2.java public class Example3_2{ public static void main(String args[ ]){ char a[ ]={'金','木','水','火','土'}; char secret='z'; for(int i=0;i<a.length;i++){ a[i]=(char)(a[i]^secret); } System.out.printf("密文:\n"); System.out.printf("%3c",a[i]); System.out.printf("\n原文:\n");
for(int i=0;i<a.length;i++){ System.out.printf("%3c",a[i]); } 输出结果: 密文: 醫 杒 汎 瀑 坥 原文: 金 木 水 火 土
3.7 条件运算符 条件运算符是一个3目运算符,它的符号是:“?:” 用法: op1?op2:op3 3.7 条件运算符 条件运算符是一个3目运算符,它的符号是:“?:” 用法: op1?op2:op3 要求第一个操作元op1的值必须是boolean型数据 运算法则是:当op1的值是true时,op1?op2:op3运算的结果是op2的值;当op1的值是false时,op1?op2:op3运算的结果是op3的值 12>8?100:200的结果是100 12<8?100:200的结果是200 返回
3.8 instanceof 运算符 该运算符是双目运算符,左面的操作元是一个对象,右面是一个类。 当左面的对象是右面的类创建的对象时,该运算的结果是true,否则是false。 该运算符将在第4章以后使用。 例: String s=new String("javaisland"); System.out.println(s instanceof String); //true 返回
3.9 一般表达式 Java的一般表达式就是用运算符及操作元连接起来的符合Java规则的式子,简称表达式。 3.9 一般表达式 Java的一般表达式就是用运算符及操作元连接起来的符合Java规则的式子,简称表达式。 一个Java表达式必须能求值,即按着运算符的计算法则,可以计算出表达式的值。 int x=1, y=-2, n=10; x+y+n的值是int型数据9。 int x=2, y; y=x的值是int型数据2。 返回
3.10 语句概述 Java里的语句可分为以下5类: 1、方法调用语句:对象调用类中的方法产生行为。 reader.nextInt(); 3.10 语句概述 Java里的语句可分为以下5类: 1、方法调用语句:对象调用类中的方法产生行为。 reader.nextInt(); 2、表达式语句:一个表达式的最后加上一个分号就构成了一个语句,称作表达式语句;分号是语句不可缺少的部分。 x=2+3; 返回
3、复合语句:可以用“{”和“}”把一些语句括起来构成复合语句,一个复合语句也称作一个代码块。 { z=23+x; System.out.println(“Hello”); } 4、控制语句:条件分支语句、循环语句和跳转语句 5、package语句和import语句
3.11 分支语句 条件分支语句(if-else) 格式:if (表达式) <语句1> else <语句2> 3.11 分支语句 条件分支语句(if-else) 格式:if (表达式) <语句1> else <语句2> 流程图: 表达式的值必须是boolean型的 多个if-else语句嵌套可以形成多条件if-else语句 例3-3:用户在键盘输入3个数,程序判断这3个数能构成什么形状的三角形? true false 表达式 语句1 语句2
import java.util.*; public class Example3_3{ public static void main (String args[ ]){ Scanner reader=new Scanner(System.in); double a=0,b=0,c=0; System.out.print("输入边a:"); a=reader.nextDouble(); System.out.print("输入边b:"); b=reader.nextDouble(); System.out.print("输入边c:"); c=reader.nextDouble(); if(a+b>c&&a+c>b&&b+c>a){ if(a*a==b*b+c*c||b*b==a*a+c*c||c*c==a*a+b*b){ System.out.printf("%-8.3f%-8.3f%-8.3f构成是直角三角形",a,b,c); }
else if(a*a<b*b+c*c&&b*b<a*a+c*c&&c*c<a*a+b*b){ System.out.printf("%-8.3f%-8.3f%-8.3f构成锐角三角形",a,b,c); } else{ System.out.printf("%-8.3f%-8.3f%-8.3f构成钝角三角形",a,b,c); System.out.printf("%f,%f,%f不能构成三角形",a,b,c);
输出结果: 输入边a:3 4 5 输入边b:输入边c:3.000 4.000 5.000 构成是直角三角形 输出结果: 输入边a:1 2 3 输入边b:输入边c:1.000000,2.000000,3.000000不能构成三角形 输出结果: 输入边a:3 8 10 输入边b:输入边c:3.000 8.000 10.000 构成钝角三角形
有一函数: x ( x<1 ) y = 2x-1 ( 1≤x<10 ) 3x-11 ( x≥10 ) 写一程序在键盘输入x的值,求y值。
import java.util.*; public class Ex31 { public static void main (String args[ ]) Scanner reader=new Scanner(System.in); double x,y; System.out.print("输入x:"); x=reader.nextDouble(); System.out.print("输入y:"); y=reader.nextDouble(); if (x>=1) if (x<10) y=2*x-1; else y=3*x-11; else y=x; }
输出结果: 输出结果: 输入x:2 y=3.000000 输入x:0.5 y=0.500000 输出结果: 输入x:11 y=22.000000
switch开关语句 格式: switch (<表达式>) { case 常量值1:若干语句 break; case 常量值2:若干语句 … … … case 常量值n:若干语句 default: 若干语句 }
switch语句中表达式的值必须是整型或字符型。 常量值1到常量值 n必须也是整型或字符型。 执行过程: switch语句首先计算表达式的值,如果表达式的值和某个case 后面的常量值相同,就执行该case里的若干个语句,直到碰到break语句为止。 若没有任何常量值与表达式的值相同,则执行default后面的若干个语句;其中default是可有可无的,如果它不存在,并且所有的常量值都和表达式的值不相同,那么switch语句就不会进行任何处理。 需要注意的是,在同一个switch语句中,case后的常量值必须互不相同。 例3-4:使用switch语句,用户在键盘输入一个代表月份的整数,程序输出是该月是在年度的第几季度? 返回
import java.util.*; public class Example3_4{ public static void main (String args[ ]){ Scanner reader=new Scanner(System.in); System.out.println("输入一个月份:"); int n=reader.nextInt(); switch(n){ case 1 : case 2 : case 3 :System.out.printf("%d月属于第一季度",n); break; case 4 : case 5 : case 6 :System.out.printf("%d月属于第二季度",n);
case 7 : case 8 : case 9 :System.out.printf("%d月属于第三季度",n); break; case 10 : case 11 : case 12 :System.out.printf("%d月属于第四季度",n); default: System.out.printf("%d不代表月份",n); } 输出结果: 输入一个月份: 4 4月属于第二季度
3.12 循环语句 while循环 格式: while (表达式) {若干语句} 流程图: false 表达式 3.12 循环语句 while循环 格式: while (表达式) {若干语句} 流程图: 表达式的值为boolean型数据 false 表达式 true 循环体
do-while循环 格式: do{ 若干语句 } while(表达式); do-while循环和while循环的区别是:do-while的循环体至少被执行一次。 流程图: 例3-5:分别用while和do-while循环计算常数e的近似值:e=1+1/1+1/2!+1/3!+… … do 语句入口 循环体 true 表达式 false 向下执行
public class Example3_5{ public static void main (String args[]){ double sum=0,item=1; int i=1; while(i<=1000){ sum=sum+item; i++; item=item*(1.0/i); } sum=sum+1; System.out.println("e="+sum); sum=0; i=1; item=1;
do{ sum=sum+item; i++; item=item*(1.0/i) ; } while(i<=1000); sum=sum+1; System.out.println("e="+sum); } 输出结果: e=2.7182818284590455
for循环 格式:for (表达式1;表达式2;表达式3){ 若干语句} “表达式2”必须是一个求值为boolean型数据的表达式 流程图: 表达式1 false 表达式2 true 循环体 表达式3
例3-6:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,6=1+2+3。下面使用for循环计算出1000内的全部完数 。 返回
public class Example3_6{ public static void main (String args[ ]){ int sum,i,j; for(i=1;i<=1000;i++){ for(j=1,sum=0;j<=i/2;j++){ if(i%j==0){ sum=sum+j; } if(sum==i){ System.out.printf("%8d是一个完数%n",i); 输出结果: 6是一个完数 28是一个完数 496是一个完数
3.13 跳转语句 跳转语句是指用关键字break或continue加上分号构成的 语句。 在循环语句的循环体中使用跳转语句。 3.13 跳转语句 跳转语句是指用关键字break或continue加上分号构成的 语句。 在循环语句的循环体中使用跳转语句。 在一个循环中,比如循环50次的循环语句中,如果在某次循环 体的执行中执行了break语句,那么整个循环语句就结束。 在一个循环中,比如循环50次的循环语句中,如果在某次循环 体的执行中执行了continue语句,那么本次循环就结束,即不 再执行本次循环中循环体中continue语句后面的语句,而转入 进行下一次循环。 下面的例3-7、例3-8使用的跳转语句。 返回
public class Example3_7{ public static void main(String args[]){ int sum=0,i=0,max=8888,number=7; while(true){ i++; sum=sum+i; if(sum>=max) break; } System.out.println("1+2+...n<"+max+"的最大整数n是:"+(i-1));
for(i=1,max=200,sum=0;i<=max;i++){ if(i%number!=0){ continue; } sum=sum+i; System.out.println(max+"内能被"+number+"整除的数字之和:"+sum); 输出结果: 1+2+...n<8888的最大整数n是:132 200内能被7整除的数字之和:2842
import java.util.Scanner; public class Example3_8{ public static void main(String args[]){ int n,start,end,middle; int a[]={-2,1,4,5,8,12,17,23,45,56,90,100}; start=0; end=a.length; middle=(start+end)/2; int count=0; Scanner reader=new Scanner(System.in); System.out.print("请输入一个整数:"); n=reader.nextInt();
while(n!=a[middle]){ if(n>a[middle]){ start=middle; } else if(n<a[middle]){ end=middle; middle=(start+end)/2; count++; if(count>a.length/2) break;
if(count>a.length/2) System.out.println(n+"不在数组中"); else System.out.println(n+"是数组中的第"+middle+"个元素"); }
输出结果: 请输入一个整数:12 12是数组中的第5个元素 输出结果: 请输入一个整数:10 10不在数组中