您的位置:首页 > 编程语言 > Java开发

Java 运算符、表达式和流程控制

2012-03-28 19:09 495 查看
Java 运算符、表达式和流程控制

任何语言都有自己的运算符,java语言也不例外。

Java中的流程控制语句分为分支语句、循环语句等,是程序中非常关键和基础的部分。

1、运算符和表达式

基本概念

运算符:用于标记对数据执行某种运算的特定符号 。

操作数:参加运算的数据称为运算对象(操作数)。

分类

按运算符的功能,将运算符分为:算术运算符、关系运算符、逻辑运算符、位运算符等

按参与运算的操作数的个数,将运算符分为:单目运算符、双目运算符、三目运算符

表达式:若干操作数(operand)和运算符(operator)按照约定规则构成的一个序列 。

Java提供了丰富的运算符,主要包括以下几类。

算术运算符:+、-、*、/、%、++、--。

关系运算符:>、<、>=、<=、==、!=。

逻辑运算符:!、&&(&)、||(|)、^。

位运算符:~、&、|、^、<<、>>、>>>。

赋值运算符:简单赋值(=)、复合算术赋值(+=、-=、*=、/=、%=)和复合位运算赋值(&=、|=、^=、>>=、<<=、>>>=。)

条件运算符:?:。

算术运算符

加运算符+:连接两个字符串。例如,“abc”+12的结果为“abc12”;”abc”+1+2=? “abc”+(1+2)=?

Java语言既可对整数取模,也可以对小数取模。例如,16.2%5=1.2

char类型的数据可以进行算术运算,而boolean类型的数据不能进行算术运算。

++(--)运算符的操作数必须是变量,不能是常量或表达式 。++i 或者 i++ (注意两者的区别)

关系运算符

关系运算符用于判断两个操作数的等价性和大小关系,得到的结果为布尔类型,取值为true或false。常用于逻辑判断(if语句或循环)。

逻辑运算符

逻辑运算符可以对boolean类型数据进行逻辑上的“与”、“或”、“非”、“异或”等运算,结果仍为boolean类型,通常用于程序的流程控制。逻辑运算符 &(&&)、|(||)、!

注意:运算符(&、|)和运算符(&&、||)的区别。

位运算符

位运算符用来对整型(byte、short、int、long)或字符型(char)数据二进制位进行操作,结果为一个整数。

~(按位取反)

格式: ~a

功能:将操作数a中的二进制位由1变0,由0变1。

例如:int x=2; ~x=?

&(按位相与)

格式:a & b

功能:两个操作数的相应位都为1,则该位为1,否则为0。 例如, int x=2,y=7; x & y = ?

|(按位相或)

格式:a | b

功能:两个操作数的相应位中有一个为1,则该位的结果为1。例如,int x=5,y=8; x | y = ?

^(按位相异或)

格式:a ^ b

功能:两个操作数的相应位相异,则该位的结果为1,否则为0。例如,int x=5,y=8; x ^ y = ?

注意:运算符&、|、^什么时候实施的是逻辑运算?什么时候实施的是位运算?

注意:当参与运算的操作是boolean类型时,运算符&、|、^是逻辑运算符,实现逻辑与,逻辑或以及逻辑异或的运算;当参与运算的操作数是整数类型(包括byte、short、int、long)或字符类型(char)时运算符&、|、^是位运算符,实现按位与、按位或、按位异或的运算。

例3.4 位运算的使用。

>>(按位右移)

格式:a >> b

功能:将a右移b位,右端的低位被舍弃,左端高位补原来的符号位 。例如,byte x=-6;x >>2 = ?

<<(按位左移)

格式:a << b

功能:将a左移b位,右端的低位补0,左端的高位被舍弃。例如,byte x=-6;x << 2 = ?

>>>(无符号右移)

格式:a >>> b

功能:将a右移b位,右端的低位被舍弃,左端的高位补0。例如,byte x=-6;x >>> 2 = ?

注意:移位运算时真正的移位位数不一定是指定的b位。当a为int型(或byte、short、char型)时,系统会先将b对32取模,得到的结果才是真正移位的位数,而当a为long型时,系统先将b对64取模,得到的结果作为真正的移位位数。

例3.5 位运算的综合应用。

分析:方法getOneBit()可以返回参数num的第n-1位。

public int getOneBit(int num,int n){

int i=1 << (n-1);

int nb = num & i;

return nb >> (n-1);

}

赋值运算符

格式:变量=表达式(不允许是常量或表达式)

double d = 7.8f; //合法

int a = 78L; //非法

int a = (int)78L; //合法

(当赋值运算符两侧的类型不一致时,如果左侧变量的数据类型的表示范围更大,则把右侧的数据自动转换为与左侧相同的数据类型,然后赋给左侧变量,否则,需要使用强制类型转换运算符。)

复合的赋值运算符

+= -= *= /= %= &= |= ^= >>= <<= >>>=

条件运算符

条件运算符是java语言中的唯一一个三目运算符(需要3个操作数),其一般格式如下;

格式:表达式1 ? 表达式2 :表达式3

需注意: 表达式1应是boolean类型的表达式;表达式2和表达式3的类型要一致。

例3.6 条件运算符的使用。

分析:

弹出输入对话框,接收用户输入: JOptionPane.showInputDialog(s)

将数字的字符串表示形式转换为整数:Integer.parseInt(s)

result = (score>=60) ? "及格" : "不及格"

System.out.println(result);

表达式

表达式(expression)是由若干操作数(operand)和运算符(operator)按照约定规则构成的一个序列。

运算符标明对操作数进行何种操作;

操作数可以是变量、常量或有返回值的方法调用等其他的表达式。

如:(a-b)/c+4 5>=a a>3 && a<10 10*max(a,b) a=10 100

声明过的单个变量或常量就是一种最简单的表达式。当表达式中包含多个运算符时,系统会按照运算符的优先级(Precedence)来控制运算执行顺序。同优先级的运算符连续出现时按照约定的结合方向进行运算。

运算符的优先级

运算符的结合性

表达式中的数据类型转换

自动类型转换

当不同类型的常量和变量在表达式中混合使用时,它们最终将被转换为同一类型,然后进行运算。为了保证精度,转换从表示数的范围较小的数据类型到表示数的范围较大的数据类型。

(byte或short)和intàint

(byte或short或int)和longàlong

(byte或short或int或long)和floatàfloat

(byte或short或int或long或float)和doubleàdouble

char和intàint

(注意:箭头左边表示参与运算的数据类型,操作可以是算术运算、赋值运算等,箭头右边表示转换后进行运行的数据类型

)(例如:long longVar = 12345; double doubleVar = 1.2f;

float f = 23456434563L;

doubleVar = doubleVar * (12 + longVar);

int a=doubleVar/100; //错,需使用强制类型转换

注意:布尔类型不能与任何其它数据类型转换。



强制类型转换

格式:(目标数据类型)变量或表达式

例如,(float)5 / 9 * (f - 32) //该表达式将int型常量5强制转换位5.0f,再和9相除

注意:强制类型转换时,由于目标数据类型的取值范围小于待转换数据类型的取值范围,在转换过程中会出现截断,导致高位数据丢失或精度下降。

例3.8将32位整数65366强制转换为byte型后,整数的高位被截掉,只剩下低8位,字节数据为86,导致数据丢失。

Public class TypeConversion{

Public static void main(String[] args){

Int intVar = 0xff56;

Byte byteVar = (byte)intVar;

System.out.println("intVar=" + Integer.toString(intVar, 2)+";"+intVar);

System.out.println("byteVar="+ Integer.toString(byteVar, 2)+";"+byteVar);

}

}

流程控制

三种基本的流程控制结构

顺序结构

分支结构:if-else语句、switch语句

循环结构:while语句、do-while语句、for语句、break语句、continue语句、return语句

任何编程语言中最常见的程序结构就是顺序结构。顺序结构:顺序结构就是程序从上到下一行一行地执行,中间没有任何判断和跳转。如果没有流程控制,java方法中的语句是一个顺序执行流,从上到下依次执行每条语句(即根据语句出现的先后顺序依次执行)。

分支结构:根据条件从两个分支中选择其一执行。先判断条件,当条件成立时,执行语句一,反之执行语句二。

循环机构:满足某一条件时重复执行,直到条件不满足。先判断条件,当条件成立时,反复执行语句知直到条件不成立时退出循环,执行下一个基本结构。

Java提供了两种常见的分支控制结构:if语句和switch语句。

If语句使用布尔表达式或布尔值作为分支条件来进行分支控制。

Switch语句由一个空子表达式和多个case标签组成。和if语句不同的是,switch语句后面的控制表达式的数据类型只能是整型或字符型,而不能是boolean型。Case标签后紧跟一个代码块,case标签作为这个代码块的标识。

While循环语句

While循环的语法

[int_statements]

While(test_expression){

Statements;

[iteration_statements]

}

While循环每次执行循环之前,先对test_expression循环条件求值,如果循环条件位true,则运行循环体部分,从上面的语法格式来看,迭代语句iteration_statements总是位于循环体的最后,因此只有当循环体能成功执行完成时,while循环才会执行iteration_statements迭代语句。从这个意义上看,while循环也可被当成条件语句-----如果test_expression条件一开始就为false,则循环体部分将永远不会获得执行。

Do……while循环语句与while循环语句的区别在于:while循环式先判断循环条件,如果条件是真才执行循环体:而do……while循环则先执行循环体,然后判断循环条件,如果循环条件为真,则执行下一次循环,否则中止循环。

……{

……{

Do{

System.out.println(i + "\t");

i++;

}

While(i<10);

System.out.println("\n循环结束!");

}

}

For循环

For循环式更简洁的循环语句,大部分情况下,for循环可以代替while循环、do……while循环。

For([init_statements];[test_expression];[iteration_statement]){

Statements;

}

For循环和while、do……while循环不同:由于while、do……while循环的循环迭代语句紧跟着循环体,因此如果循环体不能完全执行,如使用continue来结束本次循环,则循环迭代语句不会被执行;但for循环的循环迭代语句并没有与循环体放在一起,因此不管是否使用continue来结束本次循环,循环迭代语句一样会获得执行。

控制循环结构

Java语言没有提供goto语句来控制程序的跳转,这种做法提高了程序控制的可读性,但也降低了程序流程控制的灵活性。为了弥补这种不足,java提供了continue和break来控制循环结构,除此之外,return可以结束整个方法,当然也就结束了一次循环。

在某些时候,我们需要在某种条件出现时,强行终止循环,而不是等到循环条件为false时。此时,可以使用break来完成这个功能。Break用于完全结束一个循环,跳出循环体。不管是哪种循环,一旦在循环体中遇到break,系统将完全结束该循环,开始执行循环之后的代码。

break语句

格式:break; 或 break 标号;

功能:带标号的break语句从多重循环体的内部跳出到标号所标志的那层循环,并从标号标志的那层循环后面的语句继续执行。

例3.22 带标号的break语句的使用。

outer:

for (int i = 0 ; i < 5 ; i++ ){

for (int j = 0; j < 3 ; j++ ){

。。。

if (j == 1){

//跳出outer标签所标识的循环。

break outer;

}

}

}

(注意:在多重循环中,不带标号的break语句将只退出它所在的内循环。



continue语句

格式:continue; 或 continue 标号;

功能:带标号的continue语句可从多重循环的内层循环跳到外层循环,执行标号所标识的循环的下一轮。

Continue的功能和break的有点类似,区别是continue只是中止本次循环,接着开始下一次循环;而break则是完全终止循环。可以理解为continue的作用是略过当次循环中剩下的语句,重新开始新的循环。

例3.24 带标号的continue语句的使用。

outer:

for (int i = 0 ; i < 3 ; i++ ){

for (int j = 0; j < 3 ; j++ ){

。。。

if (j == 1){

continue outer;

}

}}

return语句

return关键字并不是专门用于跳出循环的,而是结束一个方法。一旦在循环体内执行到一个return语句,该方法将会结束,循环自然也随之结束。

例3.25 使用return结束循环。

for (int i = 0; i < 3 ; i++ ){

System.out.println("i的值是" + i);

if (i == 1){

return;

}

System.out.println(“return后的输出语句");

}

标准输入/输出

用户在程序运行过程中从外界传递数据到程序中(此为输入数据),并将处理结果传递到程序外部,如显示到屏幕上或写出到文件中(此为输出数据)。

什么是控制台

“控制台”(Console)就是由操作系统提供的一个字符界面窗口,用于实现系统与用户的交互——接收用户输入的数据并显示输出结果。

在控制台中运行的程序被称为控制台应用程序 ,也称字符界面应用程序。

读取控制台输入

java.util.Scanner类的功能并不仅限于控制台输入数据的读取,它的对象还可以关联到字符串、文件或其他的数据源。

构造方法

public Scanner(InputStream source)

例如,Scanner sc=new Scanner(System.in);

public Sting next()

读取下一个单词,以空格符或换行符作为分隔单词的标记。例如,String name=sc.next();

public int nextInt()

读取一个整数,如果输入的下一个单词不能解析为有效的整数(例如包含汉字等非数值字符),则出错。

public double nextDouble()

读取一个双精度浮点数,如果输入的下一个单词不能解析为有效的浮点数,则出错。

public Boolean nextBoolean()

读取一个布尔值,如果输入的下一个单词不能解析为有效的boolean值(true或false),则出错。

例3.26 Scanner类的使用。

import语句:导入java.util包中定义的Scanner类。

String name = s.nextLine(); int age = s.nextInt();

double salary = s.nextDouble();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: