Java的表达式和运算符

 1、算术运算符

运算符java

+学习

-测试

*spa

/code

%blog

说明ci

作用域

数学

it

取模(余数)

例子

1+2

5-3

20*5

6/4

30%9

结果

3

2

100

1

3

int x = 10;
int y = 6;
int result=x/y;
System.out.println(result);

其结果是1,不会带有小数部分,也就是整数运算后的到的结果也是整数,不会自动变成浮点数。

上面所具的例子都是表示二元运算符,也就是说有两个运算参数,其中“+”和“-”两个符也能够表示一元运算符,分别表示正数和负数这些运算符也能够组合成为一个复杂的运算式子,以下面这个例子:

int x = 10,y = 6,a = 20,b = 2;
int result=-x/y+a-b+a%x+-a;
System.out.println(result);

上面示例会先计算小括号的x+y和a-b两个式子,而后在按照先先乘除后加减,从左到右的计算顺序。

2、赋值运算符

运算符

=

+=

-=

*=

/=

++

--

说明

赋值

加等于

减等于

乘等于

除等于

自增1

自减1

例子

x=10

x+=y;

y-=5;

y*=z-3;

z/=3;

y++;

x--

等价于

 

x=x+y;

y=y-5;

y=y*(z-3);

z=z/3;

y=y+1;

x=x-1;

 

程序中“=”的意义与咱们平时的数学计算的式子不一样,他表示赋值的意思,就是把赋值表达式中右边的计算结果赋值左边的变量中。以下面这里例子都是赋值运算:

int x=5; //用专业的说法是把右边5的值赋值给左边的int变量x
int y=x=6; // y和x都赋值6;
int a;
a=100+200;

在赋值运算时,常常会出现左边的变量重复出如今赋值表达式的右边,如:

int a=100;
a=a+200;
a=a+200;

等价于如下形式:
a+=200;

概括一下也就是,若是expr1和expr2分别代码两个表达式,op表明运算符号,那么:

expr1=(expr1) op (expr2)

等价于

expr1 op= expr2;

注意第一个表达式,有时候括号是不可缺乏的,好比如下这个例子:

int a=10,b=3;
a*=b+1;

其意思是:

a=a*(b+1);

而不是:

a=a*b+1;

3、自增1和自减1

咱们要实现一个数的自增1或者自减1,目前能够有如下两种方法:

a=a+1或者a+=1;

a=a-1或者a-=1;

可是因为在编写程序时自增1或者自减1用得很是频繁,java语言提供了两个专门用于变量的自增1和自减1的特殊运算符,其中++是自增1运算符号,可使操做数自增1,--是自减1运算符号,可使操做数自减1。好比下面这个例子就是自增1:

int i=1;
i++;
System.out.println(i);//结果是2

须要特别留意的是++和--运算符能够前置、后置,都是合法的语句,如a++和++a都是合法的,上面这两种写法其最终的结果都是是变量a的值加1了,可是它们之间也是有区别的,其区别是:表达是++a会先将a的值自增1,而后在使用变量a。而表达式a++是先使用了a的值,而后再让a的值自增1。也就是说在一些表达式,使用a++和使用++a获得的结果时不同的。例如:

int a=1;
int b= a++;
System.out.println(b);//这时候b是1
int a=1;
int b= ++a;
System.out.println(b);//这时候b是
int a=1,b=1,c;
c=++a+b++;
System.out.println("a="+a);
System.out.println("b="+b);
System.out.println("c="+c);  //c最后的值是3

最后再提一下++和--两个运算符都只能做用于变量,而不做用域表达式。以下面这个例子是非法的。

int a=1,b=1;
 (a+b)++;

4、比较运算符

比较运算符也称为关系运算符,用于测试两个操做数之间的关系。使用关系运算符表达式的最终结果为 boolean 型,也就是其结果只有两个true和false。具体运算符号以下表所示:

运算符

==

!=

>

<

>=

<=

比较

等于

不等

大于

小于

大于等于

小于等于

例子

i==1

i!=1

i >1

i<1

i>=1

i<=1

结果

true

false

false

false

true

true

 

由上表所示,咱们判断两个数是否相等使用两个等号(==),它与(!=)具备相同的优先级。比>、<、>=、<=的优先级要高,可是算术运算符的优先级比关系运算符高,也就是说i<a+100和i<(a+100)等结果都是同样。不一样数据类型之间也能够进行比较,它们会被自动转换为相同的类型后再比较,如如下例子:

int x = 10;
float y=10.9f;
char a='0';
System.out.println(x>y);
System.out.println(a>x);

5、逻辑运算符

运算符

&

|

!

&&

||

说明

阻断与

阻断或

示例

true&false

True|false

!false

true&&false

true||false

结果

false

true

true

false

true

 

逻辑运算符很是重要,尤为是在学习了后面的条件判断后,会大量使用这些逻辑运算符。

一、与运算

与运算符号有&和&&两个,表示必须两个条件都为true时,结果才能返回true。如:

(1>2)&&(1>3) (1>2)&&(3>1) (2>1)&&(1>3) (2>1)&&(3>1)

其对应比较运算过程就是

false&&false false&&true true&&false true&&true

也就是最后的结果就是前面三个的返回都是false,只有最后一个是true。

二、或运算

或运算符号有|和||两个,表示两个条件只要有一个知足为true,最后结果返回true。仍是以上面例子说明如:

(1>2)&&(1>3) (1>2)&&(3>1) (2>1)&&(1>3) (2>1)&&(3>1)

其对应比较运算过程就是

false&&false false&&true true&&false true&&true

也就是最后的结果就是第一个返回为false,后面三个返回都是true。

三、取反运算符

取反运算符只有一个!,它是单元运算符,这个比较简单,若是是true就返回false,false就返回true,以下面的示例:

!(1>2) !(2>1)

其对应比较运算过程就是

!false !true

因此第一个返回是true,第二个返回是false。

四、组合的逻辑运算符

逻辑符能够组合使用,并结合上面比较运算符,造成一个复杂的条件判断,好比下面这个判断是不是闰年的条件判断式,闰年的判断条件是,若是此年份是4的陪数,但不是100的陪数,那么就是闰年,若是是100的陪数,还要是400的倍数才是闰年,实现代码以下:

  int year=2008;
   boolean result=year%4==0&&year%100!= 0||year % 400 == 0;

五、 &和&&、|和||的区别

参与运算的都是boolean布尔类型,在上表中的逻辑运算符&和&&、|和||的示例中,结果的都是同样的,可是在运算时却有区别。&&和||有一些比较特殊的属性,其运算的顺序是从左至右进行判断的,可是对&&而言若是在判断时获得的结果是false时,那么后面的计算就不会继续,对||而言,若是在判断时获得的结果是true,那么后面的计算也不会继续,这种机制称之为阻断判断或者短路判断,在有些状况之下,这种机制能够提升程序运行的效率。

int x=1,y=2;
boolean b;
b=x>y&&++x==--y;

b, x, y的值分别是false, 1, 2。x和y虽然上面都有自增和自减的表达式,可是却并无执行,那是由于x>y的结果是false,后面使用了短路判断&&,因此无论后面的表达式的结果是什么,最后的结果必然是false,因此后面的++x和--y其实都没有执行过,若是改为如下例子:

int x=1,y=2;
boolean b;
b=x>y&++x==--y;

由于使用了&符号,因此b, x, y的值是false, 2, 1了。

6、条件运算符

java的条件运算符是三元运算符,也就是说有三个参数参与运算,其功能是对表达式条件进行判断,根据判断结果是true或者false两种状况赋予赋予不一样的返回值,其语法以下:

表达式?值1:值2;

int a=2;
int b=1;
int c=(a>b)?3:4;
System.out.println(c);

 

7、位运算符

位运算符在java的企业应用中使用的频率并不高,可是在一些追求效率和编写底层应用时,仍是会用到位运算符,前面介绍的各类运算都是基本都是以字节做为最基本位进行运算的,而位运算符是以位(bit)做为运算单位的,因此要弄明白位运算符,必需要知道二进制表示法。

int a=1;//int 是 32 位 取最后的8位是 00000001按位位与运算符"&"就是实现参与运算的两个数对应的二进制位数执行与的操做。若是两个二进位均为1时,结果位才为1,不然就为0。前面介绍过,计算机都是采用补码的方式运行的,因此参与运算的数都是补码方式进行的。以下面所示例子:

一、按位与

int b=5;//int 是 32 位 取最后的8位是 00000101
System.out.println(a&b);//结果是 00000001

如代码所示00000001和00000101运算的结果是00000001。因此最后输出的结果是1 。

二、按位或

按位或运算符“|”就是实现参与运算的两个数对应的二进制位数执行或的操做。若是两个二进位均为0时,结果位才为0,不然就为1。咱们继续以上面所示的例子:

int a=1;//int 是 32 位 取最后的8位是 00000001
int b=5;//int 是 32 位 取最后的8位是 00000101
System.out.println(a|b);//结果是 00000101

如代码所示00000001和00000101运算的结果是00000001。因此最后输出的结果是5。

三、按位异或

按位异或运算符“^”就是实现参与运算的两个数对应的二进制位数执行异或的操做。若是两个二进位相同时,结果位为0,不一样时就为否1,简称“同0异1”。也就是说两个都是1或者两个都是0时结果为0,不然为1。仍是以上面做为例子

int a=1;//int 是 32 位 取最后的8位是 00000001
int b=5;//int 是 32 位 取最后的8位是 00000101
System.out.println(a^b);//结果是 00000100

如代码所示00000001和00000101运算的结果是00000100。因此最后输出的结果是4

四、求反

求反运算符只是单目运算符,具备右结合性,这个功能比较简单,就是对参与运算的数的各二进位按位求反。可是这个结果须要补码的运算有所了解才行。

//int 是 32 位  对应二进制就是 00000000 00000000 00000000 00000001
int a=1;
//结果也是 32 位 对应的二进制是 11111111 11111111 11111111 11111110
System.out.println(~a);

 

由于部门的第一位是符号位,按照补码的运算,对应的结果就是-2了。

五、左移

左移运算符“<<”其功能把“<<”左边的运算数的各二进位根据右边定义的数量所有左移若干位,移动的数位由右边所定义的数量决定。 移动时依据高位丢弃,低位补0的原则。

int a = 2;//int 是 32 位 取最后的8位是 00000010
System.out.println(a<<1);//左移一位后就是 00000100

最后输出的结果是4,由上面的示例可知,每左移一位后,所获得的结果就是原来的数据乘以2,因此不少时候咱们在作乘以2的操做是都是使用这个左移操做,以提升效率。

六、右移

右移运算符“>>”其功能把“>>”左边的运算数的各二进位根据右边定义的数量所有右移若干位,移动的数位由右边所定义的数量决定。 也是按照移动时依据高位丢弃,低位补0的原则。

int a = 12;//int 是 32 位 取最后的8位是 00001100
System.out.println(a>>2);//左移一位后就是 00000110

结果是3,由上面的示例可知,和左移正好相反,每右移一位后,所获得的结果就是原来的数据除以2,因此不少时候咱们在作除以2的操做是都也是使用这个由移操做,以提升效率。

相关文章
相关标签/搜索