一、Java语言的运算符:
Java语言提供了丰富的运算符,包括4类,算术运算符、位运算符、关系运算符、逻辑运算符。
1.算术运算符:
常见算术运算符有+、-、*、/、%,可用于Java基本数据类型中的数值型byte、short、char、int、long、float、double数据。
以0为除数时,对整型运算将出现异常,而对浮点数运算将得到一个无穷大值或者NaN。Java可以对浮点数进行取模运算%,结果也为浮点数,当使用0为除数时也会出现异常。
可以使用二元运算符+=、-=、*=、/=、%=。也可以使用递增和递减运算符++、--,表示对操作数加上或减去1,但注意有前缀和后缀两种形式,如count++和++count,前缀运算符会先执行运算然后生成值,而后缀运算符会先生成值再执行运算。
2.关系运算符:
Java提供了6种关系运算符,组成的表达式结果为boolean类型的值true或false:
运算符
名称
示例
功能
<
大于
a
a小于b时返回true,否则返回false
<=
小于等于
a<=b
a小于等于b时返回true,否则返回false
>
大于
a>b
a大于b时返回true,否则返回false
>=
大于等于
a<=b
a大于等于b时返回true,否则返回false
==
等于
a==b
a等于b时返回true,否则返回false
!=
不等于
a!=b
a不等于b时返回true,否则返回false
关系运算符==、!=除了可用于简单类型的操作数,还可以用于比较引用类型数据。前4种逻辑运算符不能用于boolean类型操作数。
注意逻辑运算符的优先级,前4种级别相同,后2种级别也相同,但前4种级别高于后2种;关系运算符优先级低于算术运算符;关系运算符优先级高于赋值运算符。
3.逻辑运算符:
也称为布尔运算符,包括!、&、|、^、&&、||,分别实现非、与、或、异或、短路与、短路或等逻辑运算,运算结果也是布尔类型ture或false,参与运算的数据也必须是boolean型。
符号
名称
功能
!
非
只操作一个数据,对数据取反
&
与
两个条件同时为true才为true,否则为flase
|
或
两个条件有一个为true则为true,否则为false
^
异或
两个条件真值不同结果为true,否则为false
&&
短路与
同&
||
短路或
同|
短路与&&和短路或||是按短路的方式进行求值,如果第一个表达式已经可以判断出整个表达式的值时,就不再进行后面的运算了。
4.三元运算符:
Java还支持三元运算符“?:”,也称为条件运算符,语法为:
condition?a:b
其中的condition是一个布尔表达式,如果condition为true则得到的值为a,否则值为b。
示例:y=a>b?a:b;
当a>b时执行y=a;当a
5.位运算符:
位运算符是以二进制为单位进行的运算,其操作数和运算结果都是整型值,可以使用位运算符直接处理组成这些整数的各个二进制位,适用于byte、short、char、int、long类型。
运算符
名称
示例
说明
&
位与
x&y
把x和y按位求与
|
位或
x|y
把x和y按位求或
~
位非
~x
把x按位求非
^
位异或
x^y
把x和y按位求异或
>>
右移
x<
把x的各位右移y位
<<
左移
x<
把x的各位左移y位
>>>
右移
x>>>y
把x的各位右移y位,左边填0
移位运算中,左移的移出位丢弃,右边的空位补0;右移运算的移出位丢弃,左边的空位补0或补符号位。在使用补码为机器数的机器中,正数的符号位为0,负数的符号位为1。
6.赋值运算符:
赋值运算符=,将右边的值赋给左边的变量,右边的值可以是变量、常量、产生值的表达式,左边必须是一个明确的变量。对于基本数据类型的赋值,直接将右边的值复制到左边的变量中;对于引用数据类型的赋值,操作的并非对象本身,而是它的对象引用,实际上将右边的引用复制到左边的变量中。
赋值运算符和其他运算符结合起来,可以组成扩展赋值运算符,有+=、-=、*=、/=、%=、&=、|=、^=、>>=、<<=、>>>=等。扩展赋值运算符的引入只是为了简化赋值运算的表达形式,作用是相同的。
7.运算中的数据类型转换:
Java在编译期间会对表达式进行扩展类型检查对数据从一种类型转换到另一种类型时有严格的限制。
隐式转换,在对包含非boolean简单数据类型的表达式求值时,Java会进行大量的隐式类型转换,基本原则是提升widening转换,即只能将一种简单数据类型转换到比它范围更大的类型。比如将byte、short、char类型的数转换成int。
强制类型转换:当隐式转换不能被所要求的表达式支持,或者是有特殊的需求,则需要进行强制的类型转换。比如将double类型转换成int类型数据,这种转换可能会引起信息的丢失,需要小心使用。
类型转换还可以使用于引用数据类型,任何对象都可以被转换成它的基类或任何它所实现的接口,一个接口也可以被转换成它所扩展的任何其他接口。
8.运算符的优先顺序:
Java运算符在风格上和功能上都与C和C++极为相似,各种运算符的优先顺序为:
符号类型
列表
结合顺序
分隔符
[] () ; ,
单目运算符
++ -- + - ~ !
从右到左
创建或类型转换
new (type)expr
乘/除
* / %
从左到右
加/减
+ -
从左到右
移位
<< >> >>>
从左到右
关系
< > <= >= instanceof
从左到右
等价
== !=
从左到右
按位与
&
从左到右
按位异或
^
从左到右
按位或
|
从左到右
条件与
&&
从左到右
条件或
||
从左到右
条件
?:
从右到左
赋值
= *= /= %= += -= <<= >>= >>>= &= ^= |=
从右到左
9.字符串连接运算符:
运算符+除了用于数值类型的加法运算外,在字符串类型String数据中,还是用于连接字符串的特殊运算符。在表达式中,用+连接两个操作数,其中一个操作数是字符串类型String,自动将另一个操作数也转换成字符串,然后将这两个字符串相连起来生成一个新的字符串。
10.表达式:
表达式就是运算符和操作数的结合。所有的数学运算都认为是从左到右结合的,Java中的大部分运算也是从左到右结合的,只有单目运算符、赋值运算符和条件运算符例外。
二、Java语言的流程控制语句:
从结构化程序设计角度,程序有顺序结构、选择结构、循环结构。顺序结构的执行顺序是自上而下依次执行。选择结构主要通过分支语句实现程序流程控制,主要有if-else和switch两种。
1.分支语句:
①if语句:
if条件语句是最常见的一种分支语句,基本格式有3种:
if (boolean条件表达式) {
语句A;
}
if (boolean条件表达式) {
语句A;
}else{
语句B;
}
if (boolean条件表达式1)
语句1;
else if(boolean条件表达式2)
语句2;
else if(boolean条件表达式3)
语句3;
......
else if(boolean条件表达式n){
语句n;
else
语句n+1;
if语句中,当表达式为true时执行相应的语句,否则跳过而执行后面的语句。
②switch语句:
对多分支选择,使用if-else形式比较麻烦,常使用switch语句,也称开关语句。
switch (表达式) {
case 1:
语句1;
break;
case 2:
语句2;
break;
case 3:
语句3;
break;
......
case n:
语句n;
break;
default:
语句n+1;
}
switch后面的表达式应为整型,而每一个case都用唯一的常量表达式或常量来表示,用于控制这个case是否被执行,程序将执行到那些表达式值与控制表达式的值相匹配的case分支中;如果不存在匹配,则执行default后面的代码块;如果没有default标记,则执行switch后面的语句,即退出了switch分支。其中的控制表达式必须是可以转换为byte、short、char、int类型的值的表达式。在每一个case标记的代码块中最后都有一个break语句,否则会连续执行下面的case语句。
2.循环语句:
Java语言支持3种循环类型,for、while和do...while。
①for语句:
for (初始化语句;循环条件;迭代语句) {
循环体;
}
其中,初始化语句是循环的初始状态;循环条件是条件判断的布尔表达式,如果表达式为true则执行后面的语句;后面是迭代语句。如果条件表达式第一次求值就为false,那么for循环不会进行任何迭代,后面的循环体和迭代语句也不会执行任何操作。
一次循环结束后,下一次循环开始之前,执行迭代部分的语句,然后判断循环表达式的值,决定是否进行下一次循环。示例:
int counter=1;
for (int i=5;i>1;i--){
counter=counter*i;
}
上面的代码执行一个简单的阶乘运算。
Java允许在for语句的循环控制的各个部分放置任何表达式,如:
for (int b=0,s=0,p=0;(b<10)&&(s<4)&&(p<10);p++){
//代码块;
//更新b和s的值
}
示例中初始化变量有3个,但只能有一个声明语句,所以初始化的多个变量必须是同一数据类型。for语句中三部分的表达式中任何一个表达式都可以为空,甚至三个可以都为空而成为无限循环,但应避免这种情况。
在for语句内定义的变量,作用范围仅限于for语句块、表达式及for子句的语句部分,在for循环终止后将不可访问。如果需要在for循环外部使用循环计数器的值,可以将这个变量定义在for循环体外。示例:
int k;
for (k=0;k<10;k++){
//statements
}
②while语句:
while (条件判断表达式) {
循环体;
迭代运算;
}
while语句首先测试条件表达式,其值必须为布尔类型,如果为true则运行代码块中的语句,并且一般需要进行迭代运算以改变条件表达式中变量的值,直到表达式中的值变为false。如果刚开始条件表达式就为false,则while循环体一次也不会被执行。
③do...while语句:
[初始化表达式]
do{
循环体;
迭代运算;
}while(条件表达式);
do...while循环类似于while循环,在while后面也要跟一个boolean类型的条件表达式。do...while循环首先执行循环体中的代码,然后再判断条件表达式是否为true;如果为true,则返回到do语句来执行;否则,退出循环。do...while循环至少会执行一次。
④break语句:
循环体内,经常需要在某种条件出现时,强制终止循环的运行,可以通过break来完成。break语句常用在循环和开关语句中。
break还可以与标号一起使用,控制break中断后跳转的位置。示例:
outer:
for (int i=0;i<10;i++){
System.out.println("Outer loop:");
inner:
while(true){
int k=System.in.read();
System.out.println("Inner Loop:"+k);
if (k=='b') break inner;
if (k=='q') break outer;
}
}
break与label结合,也可以终止普通的语句块。
⑤continue语句:
用来略过循环中剩下的语句,停止当前迭代,重新开始新的循环。continue仅仅出现在while/do...while/for语句的语句块中,也可以使用和label结合的方式来选择需要终止的嵌套循环的层级。