02_Java基本语法_3
2.2.10 运算符、表达式与语句
程序是由许多语句组成的,而语句的基本单位是表达式与运算符。本节将介绍Java运算符的用法、表达式与运算符之间的关系,以及表达式里各种变量的数据类型的转换等。学完本节,希望大家能对Java语句的运作过程有更深一层的认识。
2.2.10.1运算符
Java提供了许多的运算符,这些运算符除了可以处理一般的数学运算外,还可以做逻辑运算、地址运算等。
根据操作数的个数的不同,可以将运算符分为:单目运算符(++、--)、双目运算符(+,-,*)、三目运算符(?: 运算符)。
根据使用场合的不同,运算符可分为赋值运算符、算术运算符、关系运算符、逻辑运算符、条件运算符、括号运算符、位运算符等。
2.2.10.1.1 赋值运算符号
想为各种不同数据类型的变量赋值时,就必须使用赋值运算符(=),表2-7中所列出的赋值运算符虽然只有一个,但它却是Java语言中必不可缺的。
表2-7 赋值运算符
等号(=)在Java中并不是“等于”的意思,而是“赋值”的意思。还记得在前几章中,为变量赋值的语句吗?
图2-6 表达式的赋值范例
上面的语句是将整数22赋值给num这个变量。再来看看下面这个语句:
num = num - 3; // 将num-3的值运算之后再赋值给变量num存放
从未学习过C或C++的学生,可能会不习惯这种思考方式。若是把等号(=)当成“等于”,这种语句在数学上根本说不通,但是把它看成“赋值”时,这个语句就很容易理解了,把num-3的值运算之后再赋值给num存放,因为之前已经把num的值设为22,所以执行这个语句时,Java会先处理等号后面的部分num-3(值为19),再赋值给等号前面的变量num,执行后,存放在变量num的值就变成了19了。将上面的语句编写成下面这个程序:
范例:TestJava2_15.java
//在程序中赋值采用“=” public class TestJava2_15 { public static void main(String args[]) { int num = 22; //声明整数变量num,并赋值为22 System.out.println("第一次赋值后,num = " + num);//输出num的值 num = num - 3;//将变量num的值减三之后再赋给num变量 System.out.println("改变之后的值,num = " + num);//输出计算后num的值 } }
输出结果:
第一次赋值后,num = 22
改变之后的值,num = 19
当然,在程序中也可以将等号后面的值赋值给其他的变量,如:
in sum = num1+num2 ; // num1与num2相加之后的值再赋给变量sum存放
num1与num2的值经过运算后仍然保持不变,sum会因为“赋值”的操作而更改内容。
2.2.10.1.2 算术运算符
算术运算符在数学上面经常会使用到,表2-8列出了它的成员:
表2-8 算术运算符
·加法运算符“+”
将加法运算符“+”的前后两个操作数相加。如下面的语句:
System.out.println("3 + 8 = "+(3+8)); // 直接输出表达式的值
·减法运算符“-”
将减法运算符“–”前面的操作数减去后面的操作数,如下面的语句:
num = num - 3; // 将num - 3运算之后赋值给num存放
a = b - c; // 将b - c运算之后赋值给a存放
·乘法运算符“*”
将乘法运算符“*”的前后两个操作数相乘,如下面的语句:
b = b * 5; // 将b*5运算之后赋值给b存放
a = a * a; // 将a * a运算之后赋值给a存放
·除法运算符“/”
将除法运算符“/”前面的操作数除以后面的操作数,如下面的语句:
a = b / 5; // 将b / 5运算之后的值赋给a存放
c = c / d; // 将c / d运算之后的值赋给c存放
使用除法运算符时要特别注意一点:除数不能为0。还有就是数据类型的问题。以上面的例子来说当a、b、c、d的类型皆为整数,若是运算的结果不能整除时,输出的结果与实际的值会有差异,这是因为整数类型的变量无法保存小数点后面的数据,因此在声明数据类型及输出时要特别小心。以下面的程序为例,在程序里给两个整型变量a、b赋值,并将a / b的运算结果输出:
范例:TestJava2_16.java
//下面这段程序说明了除法运算符的使用方法 public class TestJava2_17 { public static void main(String[] args) { int a = 13; int b = 4; System.out.println("a = " + a + " , b = " + b); System.out.println("a / b = " + (a / b)); System.out.println("a / b = " + ((float) a / b)); // 进行强制类型转换 } }
输出结果:
a = 13 , b = 4
a / b = 3
a / b = 3.25
程序说明:
1、第9行与10行,程序分别做出不同的输出:第10行中,因为a,b皆为整数类型,输出结果也会是整数类型,程序运行结果与实际的值不同。
2、第10行中,为了保证程序运行结果与实际的值相同,所以使用了强制性的类型转换,即将整数类型(int)转换成浮点数类型(float),程序运行的结果才不会有问题。
·余数运算符“%”
将余数运算符“%”前面的操作数除以后面的操作数,取其所得到的余数。下面的语句是余数运算符的使用范例:
num = num % 3; // 将num%3运算之后赋值给num存放
a = b % c; // 将b%c运算之后赋值给a存放
注意:与C/C++不同,Java里面的%除了可以用于整型数据还可以用于浮点型数据(float、double)。以下面的程序为例,声明两个整型变量a、b,并分别赋值为5和3,再将a%b的运算结果输出。
范例:TestJava2_17.java
//在JAVA中用%进行取模操作 public class TestJava2_17 { public static void main(String[] args) { int a = 5; int b = 3; System.out.println(a + " % " + b + " = " + (a % b)); System.out.println(b + " % " + a + " = " + (b % a)); } }
输出结果:
5 % 3 = 2
3 % 5 = 3
·正数运算符“+”
·负数运算符“-”
如下面的语句:
+3//表示正3
b = -a//表示将-a的值赋给变量b
除此之外,还有一些缩写的算术运算符,形如:+=、-=、/=、*=、%=等等。
2.2.10.1.3 递增与递减运算符
递增与递减运算符在C/C++中就已经存在了,Java仍然将它们保留了下来,是因为它们具有相当大的便利性。表2-9列出了递增与递减运算符的成员。
表2-9 递增与递减运算符
善用递增与递减运算符可使程序更加简洁。例如,声明一个int类型的变量a,在程序运行中想让它加1,语句如下:
a = a+1; // a加1后再赋值给a存放
将a的值加1后再赋值给a存放。也可以利用递增运算符“++”写出更简洁的语句,而语句的意义是相同的:
a++; // a加1后再赋值给a存放,a++为简洁写法
在程序中还可以看到另外一种递增运算符“++”的用法,就是递增运算符“++”在变量的前面,如++a,这和a++所代表的意义是不一样的。
a++:先执行整个语句后再将a的值加1
++a:则先把a的值加1后,再执行整个语句
以下面的程序为例,将a与b的值皆设为3,将a++及++b输出来,可以轻易地比较出两者的不同。
范例:TestJava2_18.java
//下面这段程序说明了“++”的两种用法的使用 public class TestJava2_18 { public static void main(String args[]) { int a = 3, b = 3; System.out.print("a = " + a); // 输出a System.out.println(" , a++ = " + (a++) + " , a= " + a); // 输出a++和a System.out.print("b = " + b); // 输出b System.out.println(" , ++b = " + (++b) + " , b= " + b); // 输出++b和b } }
输出结果:
a = 3 , a++ = 3, a= 4
b = 3 , ++b = 4 , b= 4
程序说明:
1、在第8行中,输出a++及运算后的a的值,所以执行完a++后,a的值才会加1,变成4。
2、程序的第10行中,输出++b运算后b的值,所以执行++b前,b的值即先加1,变成4。
同样的,递减运算符“--”的使用方式和递增运算符“++”是相同的,递增运算符“++”用来将变量值加1,而递减运算符“--”则是用来将变量值减1。
应当注意当多个++表达式连在一起的情况,如下:
int i = 0; int a = (i++) + (i++) + (i++); //a=i++ a=0 i=1 a+=i++ a=1 i=2 a+=i++ a=3 i=3 int b = (++i) + (++i) + (++i); //b=++i i=4 b=4 b+=++i i=5 b=9 b+=++i i=6 b=15 System.out.println("a=" + a);//3 System.out.println("b=" + b);//15
此外,递增与递减运算符只能将变量加1或减1,若是想要将变量加减非1的数时,还是得用原来的“a = a+2”的方法或“a += 2”的方法。
2.2.10.1.4 关系运算符与 if 语句
常常会在if语句中使用到关系运算符,所以有必要先来认识if语句的用法。
if语句的格式如下:
if (判断条件)
语句;
如果括号中的判断条件成立,就会执行后面的语句;若是判断条件不成立,则后面的语句就不会被执行,如下面的程序片段:
if (x>0)
System.out.println("I like Java!");
当x的值大于0,就是判断条件成立时,会执行输出字符串“I like Java!”的操作;相反,当x的值为0或是小于0时,if语句的判断条件不成立,就不会执行上述操作了。表2-10列出了关系运算符的成员,这些运算符在数学上也是经常使用的。
表2-10 关系运算符
在Java 中,关系运算符的表示方式和在数学中很类似,但是由于赋值运算符为“=”,为了避免混淆,当使用关系运算符“等于”(==)时,就必须用2个等号表示;而关系运算符“不等于”的形式有些特别,用“!=”代表,这是因为在键盘上想要取得数学上的不等于符号“≠”较为困难,所以就用“!=”表示不等于。
当使用关系运算符去判断一个表达式的成立与否时,若是判断式成立会产生一个响应值true,若是判断式不成立则会产生响应值false。以下面的程序为例,判断if语句括号中的条件是否成立,若是成立则执行if后面的语句。
范例:TestJava2_19.java
//下面这段程序说明了关系运算符的使用方法,关系运算符返回值为布尔值 public class TestJava2_19 { public static void main(String[] args) { if (5 > 2) { System.out.println("返回值:" + (5 > 2)); } if (true) { System.out.println("Hello Java!"); } if ((3 + 6) == (3 - 6)) { System.out.println("I like Java!"); } } }
输出结果:
返回值:true
Hello Java!
程序说明:
1、在第6行中,由于5>2的条件成立,所以执行第7行的语句:输出“返回值:true”。
2、在第8行中,若是if语句的参数为true,判断亦成立,所以接着执行第10行的语句:输出字符串“Hello Java!”。
3、第10行,3+6并不等于3-6,if的判断条件不成立,所以第11行语句不被执行。
2.2.10.1.5 逻辑运算符
在if语句中也可以看到逻辑运算符,表2-11列出了它的成员。
表2-11 逻辑运算符
!为单目操作符,结合顺序为从右向左,&&和||为双目运算符,结合顺序为从左向右。当使用逻辑运算符&&时,运算符前后的两个操作数的返回值皆为真,运算的结果才会为真;使用逻辑运算符“||”时,运算符前后的两个操作数的返回值只要有一个为真,运算的结果就会为真,如下面的语句:
(1) a>0 && b> 0 // 两个操作数皆为真,运算结果才为真
(2) a>0 || b>0 // 两个操作数只要一个为真,运算结果就为真
在第1个例子中,a>0而且b>0时,表达式的返回值为true,即表示这两个条件必须同时成立才行;在第2个例子中,只要a>0或者b>0,表达式的返回值即为true,这两个条件仅需要一个成立即可,可以参考表2-12中所列出的结果:
表2-12 &&和||结果表
由表2-12可以看出,在条件中,只要有一个条件为假(false),相与的结果就是假(false);相反的如果有一个条件为真(true),那么相或的结果就为真(true)。
下面的这个程序是判断a的值是否在0~100之间,如果不在即表示成绩输入错误;若是a的值在50~60之间,则需要补考。
范例:TestJava2_20.java
//下面这段程序是对与操作进行的说明,返回值为布尔类型 public class TestJava2_20 { public static void main(String[] args) { int a = 56; if ((a < 0) || (a > 100)) { System.out.println("输入的数据有错误!"); } if ((a < 60) && (a > 49)) { System.out.println("准备补考吧!"); } } }
输出结果:
准备补考吧!
程序说明:
1、当程序执行到第7行时,if 会根据括号中a的值作判断,a<0或是a>100时,条件判断成立,即会执行第8行的语句:输出字符串“输入的数据有错误!”。由于学生成绩是介于0~100分之间,因此当a的值不在这个范围时,就会视为是输入错误。
2、不管第8行是否有执行,都会接着执行第9行的程序。if再根据括号中a的值做判断,a<60且a>49时,条件判断成立,表示该成绩需要进行补考,即会执行第10行的语句,输出“准备补考吧!”。
需要注意的是:||和&&有时候会引起短路。比如:
int a = 10;
int b = 20;
boolean c = ((a < 10) && (++b > 0));
System.out.println("a="+a);
System.out.println("b="+b);
System.out.println("c="+c);
输出结果:
a=10
b=20
c=false
程序说明:
从输出结果可以看出b的值没有改变。当判断条件a<10时,发现不成立就已经可以确定整个表达式的真假情况,所以引起短路,此时就不再做++b>0的操作。
遵循的原则就是:只对能够确定整个表达式值所需要的最少数目的子表达式进行计算。也就是说,当计算出一个子表达式的值后便可确定整个逻辑表达式的值时,后面的子表达式就不需要再计算了,这种表达式也称为短路表达式。
如果下列条件满足:
“表达式1 && 表达式2”中,表达式1为false,整个表达式为false,表达式2不执行
“表达式1 || 表达式2”中,表达式1为true,整个表达式为true,表达式2不执行
例如:int a=0, b=3;对于表达式(a>0) && (b++ > 0);和(b>0) || (++a > 0);结果是b++和++a都不会得到执行,a, b的值不变。
感谢阅读。如果感觉此章对您有帮助,却又不想白瞟