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的值不变。

 

 

感谢阅读。如果感觉此章对您有帮助,却又不想白瞟

                                 

 

 

posted @ 2018-04-03 18:10  SpringL  阅读(119)  评论(0编辑  收藏  举报