第3章 运算符、表达式和语句
3.1 运算符与表达式
3.2 语句概述
3.3 控制语句
3.4 循环语句
3.5 break和 continue语句
3.1 运算符与表达式
Java 提供了丰富的运算符,如算术运算符、
关系运算符符、逻辑运算符、位运算符等。本节将介绍大部分运算符。
1,算术运算符与表达式
用算术符号和括号连接起来的符合 java语法规则的式子,称为算术表达式,如 x+2*y-30+3*(y+5)。
加减运算符,+,-,加减运算符的结合方向是从左到右。,加减运算符的优先级是 4级。
乘,除和求余运算符,*,/,%,运算符的结合方向是从左到右,乘除运算符的操作元是整型或浮点型数据。 *,/,%运算符的优先级是 3级。
2.自增,自减运算符,++,--
自增、自减运算符是单目运算符,可以放在操作元之前,也可以放在操作元之后。操作元必须是一个整型或浮点型变量。作用是使变量的值增 1或减 1.
++x( --x)表示在使用 x之前,先使 x的值加(减) 1。
x++( x--)表示在使用 x之后,使 x的值加(减) 1。
如,x=5;y=++x; y,x=?
x=5;y=x++; y,x=?
例 2.6
3.算术混合运算的精度精度从“底”到“高”排列的顺序是:
byte short int long float double
Java将按运算符两边的操作元的最高精度保留结果的精度,例如:
5/2的结果是 2,要想得到 2.5,必须写成 5.0/2或 5.0f/2。
char型数据和整型数据运算结果的精度是 int。例如:
byte x=7;
那么
‘ B’+x;
的结果是 int型,因此下列写法是不正确的,
char ch=’B’+x;
应当写成:
char ch=(char)(’B’+x);
4.关系运算符与关系表达式
关系运算符,<,>,<=,<=,!=
系运算符用来比较两个值的关系。关系运算符的运算结果是 boolean型,当运算符对应的关系成立时,运算结果是 true,否则是 false。
结果为数值型的变量或表达式可以通过关系运算符形成关系表达式。如,4>8,(x+y)>80。
例 2.7
5.逻辑运算符与逻辑表达式
逻辑运算符包括,&&,||,!。其中 &&,||为双目运算符,实现逻辑与、逻辑或;!为单目运算符,实现逻辑非。逻辑运算符的操作元必须是 boolean型数据,逻辑运算符可以用来连接关系表达式。例如,2>8&&9>2的结果为 false,
2>8||9>2的结果为 true。
&&,||也称为短路逻辑运算符。
x=1;((y=1)==0))&&((x=6)==6)); x=?
例 2.8
6.赋值运算符与赋值表达式
赋值运算符,=。
赋值运算符是双目运算符,左面的操作元必须是变量,不能是常量或表达式。设 x是一个整型变量,y是一个 boolean型变量,x=20和 y =
true都是正确的赋值表达式,赋值运算符的优先级较低,是 14级,结合方向右到左。赋值表达式的值就是,=”左面变量的值。注意不要将赋值运算符,=”与等号运算符,==”混淆。
7.位运算符
,&”是双目运算符,对两个整型数据 a,b按位进行运算,运算结果是一个整型数据 c。运算法则是:如果 a,b两个数据对应位都是 1,
则 c的该位是 1,否则是 0。
,|”是双目运算符。对两个整型数据 a,b按位进行运算,运算结果是一个整型数据 c。运算法则是:如果 a,b两个数据对应位都是 0,
则 c的该位是 0,否则是 1。
,~”是单目运算符。对一个整型数据 a按位进行运算,运算结果是一个整型数据 c。运算法则是:如果 a对应位都是 0,则 c的该位是 1,
否则是 1。
,^”是双目运算符。对两个整型数据 a,b按位进行运算,运算结果是一个整型数据 c。运算法则是:如果 a,b两个数据对应位相同,
则 c的该位是 0,否则是 1。
与短路逻辑运算符相反,位运算符要计算完操作数后再给出表达式运算结果。如,x=1;((y=1)==0)&((x=6)==6));x=?
移位运算符
左移位运算符( <<)
执行一个左移位,右边的空位补 0。在不产生溢出的情况下,数据左移 1位相当于乘以 2。
右移位运算符( >>与 >>>)
运算符( >>)执行一个右移位(带符号),左边按符号位补 0或 1。
运算符( >>>)同样是执行一个右移位,只是执行的是不带符号的移位,即左边空位一律补 0。
例 2.9
例子 1(效果如图 3.1)
class Example2_100
{ 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);
a1=(char)(a1^secret);
a2=(char)(a2^secret);
a3=(char)(a3^secret);
a4=(char)(a4^secret);
System.out.println("原文,"+a1+a2+a3+a4);
}
}
8,instanceof 运算符
该运算符是双目运算符,左面的操作元是一个对象;右面是一个类。当左面的对象是右面的类创建的对象时,该运算符运算的结果是
true,否则是 false。
条件运算符(?,)
在 Java语言中,使用的形式是:
(booleanExp)? exp1,exp2
上面的三目条件运算的规则是:先计算表达式的值,若为真,则整个三目运算的结果是表达式 exp1的值;若为假,则整个三目运算的结果是表达式 exp2的值。
y = (x > 0)? 1,-1;
if (x > 0)
y = 1;
else
y = -1;
Operator Precedence
var++,var--
+,- (Unary plus and minus),++var,--var
(type) Casting
! (Not)
*,/,% (Multiplication,division,and remainder)
+,- (Binary addition and subtraction)
<,<=,>,>= (Comparison)
==,!=; (Equality)
& (Unconditional AND)
^ (Exclusive OR)
| (Unconditional OR)
&& (Conditional AND) Short-circuit AND
|| (Conditional OR) Short-circuit OR
=,+=,-=,*=,/=,%= (Assignment operator)
9.运算符综述
Java的表达式就是用运算符连接起来的符合 Java规则的式子。运算符的优先级决定了表达式中运算执行的先后顺序。
表达式计算的规则:
规则 1:可能的情况下,从左向右依次计算所有的子表达式。
规则 2:根据运算符的优先级进行运算
规则 3:对优先级相同的相邻运算符,根据结合方向进行运算
没有必要去记忆运算符号的优先级别,在编写程序时可尽量的使用括号()运算符号来实现你想要的运算次序,以免产生难以阅读或含糊不清的计算顺序。
3.2 语句概述
Java里的语句可分为以下五类:
1.方法调用语句,System.out.println(“Hello”);
2.表达式语句,x=23;
3.复合语句,{ z=23+x; System.out.println(z);}
4.控制语句,条件语句、循环语句等
5,package 语句和 import语句:与类、对象有关,第 4章介绍
3.3 控制语句
Java 语言的控制语句有以下几类:
分支语句,if-else,switch
循环语句,for,while,do-while
与程序转移有关的跳转语句,break,contiue,return
1.条件控制语句
if 语句的一般形式:
if(表达式 )
{ 若干语句
}
if-else 语句的一般形式:
if(表达式 )
{ 若干语句
}
else
{ 若干语句
}
语法错误
int x=1,z=1;
if(x>0)
x=10;
z=20;
else
z=100;
例 3.4
if 语句的扩充形式:
if(表达式 1)
语句 1
else if(表达式 2)
语句 2
….
else if(表达式 n)
语句 n
TIP
if (number % 2 == 0)
even = true;
else
even = false;
( a )
E q u i v a l e n t
boolean even
= number % 2 == 0;
( b )
if (even == true)
System.out.println(
"It is even.");
(a)
Equivalent if (even)
System.out.println(
"It is even.");
(b)
2,switch开关语句
switch 语句是多分支的开关语句,它的一般格式定义如下(其中 break语句是可选的):
switch(表达式 )
{
case 常量值 1:
若干个语句
break;
case 常量值 2:
若干个语句
break;
...
case 常量值 n:
若干个语句
break;
default:
若干语句
}
switch语句流程图
st a t u s i s 0
C o mp u t e t a x fo r si n g l e fi l e rs b re a k
C o mp u t e t a x fo r ma rr i e d fi l e j o i n t l y b re a k
st a t u s i s 1
C o mp u t e t a x fo r ma rr i e d fi l e se p a rat l y b re a k
st a t u s i s 2
C o mp u t e t a x fo r h e a d o f h o u se h o l d b re a k
st a t u s i s 3
D e fau l t a c t i o n s
d e fau l t
N e x t St a t e me n t
switch语句中表达式的值必须是整型或字符型;常量值 1到常量值 n必须也是整型或字符型。
switch语句首先计算表达式的值,如果表达式的值和某个 case 后面的常量值相同,就执行该 case里的若干个语句,直到碰到 break语句为止。若没有任何常量值与表达式的值相同,则执行 default后面的若干个语句。其中 default
是可有可无的,如果它不存在,并且所有的常量值都和表达式的值不相同,
那么 switch语句就不会进行任何处理。需要注意的是,在同一个 switch语句中,case后的常量值必须互不相同。
警告:有必要时,不要忘记使用 break语句。一旦有一个情况匹配,语句从匹配处开始执行,直到遇到一个 break语句或到达 switch语句的末端。这种现象称为向下贯通行为。例:
switch(ch){
case ‘a’:System.out.println(ch);
case ‘b’:System.out.println(ch);
case ‘c’:System.out.println(ch);
}
例子 2.11
返回
3.4 循环语句
1,for循环语句
for 语句是 java程序设计中最有用的循环语句之一,for语句的格式如下:
for(表达式 1;表达式 2;表达式 3)
{ 若干语句
}
例 2.12
表达式 2
循环体
true false
图 3.6 for循环语句表达式 3
表达式 1
2,while 循环一般格式:
while(表达式 )
{
若干语句
}
3,do-while循环一般格式:
do
{
若干语句
}
while(表达式 );
表达式循环体
true
false
图 3.5 while循环语句循环体表达式
true
false
图 3.6 do-while循环语句
public class Test {
public static void main(String[] args) {
// Initialize sum
float sum = 0;
for (int i = 0; i <100; i ++)
sum += 0.01;
// Display result
System.out.println("The sum is " + sum);
}
}
在 switch语中,break语句用来终止 switch语句的执行,使程序从整个 switch语句后的第一条语句开始执行。
在循环语句中,break用于终止并跳出循环,从紧跟着循环体代码段后的语句执行。
在 Java中,可以为每个代码块加一个标号,一个代码块通常是用大括号 {}括起来的一段代码。加标号的格式为:
BlockLabel:{
codeBlock;
}
break语句的第二种使用情况就是跳出它所指定的块,并从紧跟该块后的第一条语句处执行。
BlockLabel:{
codeBlock;
break BlockLabel;
codeBlock;
}
2.7 控制语句 —— 程序转移相关语句 break
a:{ //标记代码块 a
……
b:{ //标记代码块 b
……
c:{ //标记代码块 c
……
break b;
…… // 这段语句将不执行
} //代码块 c结束
…… //这段语句也不执行
} //代码块 b结束
…… //从这段语句开始执行
} //代码块 a结束
2.7 控制语句 —— 程序转移相关语句 break
continue语句用来结束本次循环,跳过循环体中下面尚未执行的语句,接着进行终止条件的判断,以决定是否继续循环 。 对于 for语句,在进行终止条件的判断前,还要先执行迭代语句 。 它的格式为:
continue;
也可以用 continue跳转到括号指明的外层循环中,这时的格式为
continue outerLable;
2.7 控制语句 —— 程序转移相关语句 continue
outer,for( int i=0; i<10; i++ ) //外层循环
{
inner,for( int j=0; j<10; j++ ) //内层循环
{
if( i<j )
{
……
continue outer;
}
……
} //内层循环结束
……
} //外层循环结束
for( int i= 0; i <10; i++ )
{
if( i == 5 )
{
continue;
}
……
}
2.7 控制语句 —— 程序转移相关语句 continue
return语句从当前方法中退出,返回到调用该方法的语句处,并从紧跟该语句的下一条语句继续程序的执行。
返回语句有两种格式:
return expression; //当方法需要返回某种类型数据时
return; //当方法的返回类型为 void时
单独一条 return语句放在方法中间时,会产生编译错误,
因为其后的语句将不会执行到 。 若真需要退出方法,可以通过将 return语句嵌入某些语句 ( 如 if-else) 来使程序在未执行完方法中所有语句时退出 。
2.7 控制语句 —— 程序转移相关语句 return
在进行程序设计时,错误的产生是不可避免得。如何处理错误?把错误交给谁去处理?
程序又该如何从错误中恢复?这是任何程序设计语言都必须面对和解决的问题。 Java语言中是通过例外( Exception)来处理错误的。我们将在第六讲中详细介绍例外及其处理。
2.7 控制语句 —— 例外处理语句 try-catch-finally,throw