java基础之运算符表达式,语句

         Java基础第二篇--------算术运算符,表达式,语句

 

 一、运算符

1.1  加减运算符: + , - ;

乘,除和取余运算符:*,  / ,   %

    自增,自减运算符: ++--

    算术混合运算的精度:

     精度从“低”到“高”的排序是:

     Byte   short  int  long    float   double 

    注意:Java按照运算符两边操作元的最高精度保留结果的精度

 

1.2关系运算符,赋值运算符

运算符

优先级

用法(表达式)

含义

结合方向

>
<
>=
<=
==
!=

6
6
6
6
7
7

op1 > op2 
op1 < op2 
op1 >= op2 
op1 <= op2 
op1 == op2 
op1 != op2

大于 
小于
大于等于      小于等于   等于
不等于

左到右 
左到右
左到右
左到右 
左到右 
左到右

 

赋值运算符:=,不再是数学含义的”等于号“了。

赋值表达式: <变量> = <常量 变量 >

 

1.3位运算符(在进行逻辑判断的时候,条件是否满足的时候经常用到,加密与解密)

     1  “按位与”运算符“&”,规则:全11,否则为0

     2. “按位或”运算符“|”,规则:全00,否则为1

     3.  “按位非”运算符“~”,规则:遇10,遇01

     4.  “按位异或”运算符“^”,规则:相同为0,不同为1

1.4逻辑运算符,短路或

运算符

优先级

用法

含义

结合方向

&&
||
!
&
|

11
12
2
8
10

op1&&op2
op1||op2
!op
op1&op2
op1|op2

短路与 
短路或 
逻辑非
逻辑与
逻辑或

左到右 
左到右 
右到左
左到右
左到右


Java&& 与 |||的区别,

&& 是逻辑运算中的”短路与”,”&&”的前面条件为false时,判断结果为false,不再执行”&&”后面的判断,”&&”前为true则继续进行后面的判断。

&是两边的条件都要满足才能是true.

 

||是逻辑运算中的”短路或”,如果||的所有条件都为false的时候,整个语句结果才是false,否则只要有一个为true,整个语句结果就为true.

 

短路与举例:

  Int  x = 1;

设置逻辑运算

  ((y=1==0) && ((x=6==6

 X的值仍然是1

设置逻辑运算

((y=1)==1) && ((x=6)==6)

X的值变为6

 

下面附上一个实例


package cn.com.basicOne;
public class ORand {
public static void main(String[] args) {
int a = 0, b = 2, c = 4,d = 5,k = 2, r = 4;
boolean x = (a==1) || (b==2);  //短路或,结果为true
System.out.println(" x = "+ x); 
boolean y = (a==1) | (b==2);   //逻辑或,结果为true
System.out.println(" y = "+y); 
boolean m =  (a==1) && (b==2);  //短路与,结果为false
System.out.println(" m = "+m);
boolean n =  (a==1) & (b==2);   //逻辑与,结果为false
System.out.println(" n = "+n);
//也可以一起使用
boolean h = (a==b) || (b==c) && (c == d); //混合结果为false ,太明显了。
System.out.println(" h = "+h);
boolean i = (b == k) || (b == c) || (c==d); //混合结果为true,因为有一个为真
System.out.println(" i = "+i);
boolean g = (b == k) && ((b == c) || (c == r));
System.out.println(" g = "+g);    //请读者判断
}
}


逻辑运算符的逻辑运算

Op1

Op2

Op1&&op2

Op1||op2

!Op1

true

true

true

true

false

true

false

false

true

false

false

true

false

true

true

false

false

false

false

true

 

逻辑运算符与位运算符的区别:

1.逻辑运算符只能针对boolean类型进行逻辑运算,而位运算还

可以对数值进行逻辑运算。

2.逻辑运算符有短路情况,即前面的表达式可以得到最终结果时,

后面的表达式将不被执行。

在初级阶段经常会遇到将十进制转换为二进制的情况,笔者在做ACM上遇到过几题。

在此说一下关于二进制的基础

    二进制转成十进制,就是按照每位的是1还是0进行判断,计算机中可以用0,1表示所有的数,而可以用2的幂的和表示所有的数,有个顺序

2^0 = 1 ,2^1=2,2^2=4.........也就是说所有的数可以用1,2,4,8,16.。。。。这些数的一部分的和来表示。

举个例子

10010111 从右向左看,第一位表示2^0 ,也就是说二进制代码中0,1的位置就是2的指数减一,所以第一位为1,第二位为2,第三位为7,第四位为0,不写,依次类推可以得到下面的表格将第二行相加就是十进制数了。

1

0

0

1

0

1

1

1

128

0

0

16

0

4

2

1

 

 

 

通常小数点在右边因此可以进行如下表述:

 二进制转十进制采用幂加和方式,从小数点左侧第一位为0次幂,小数点左侧第二位为1次幂,以此类推。当查看的位数为1时,则计算,当查看的位数为0时,则不计算。

 

补码是计算机用于规范计算的一种二进制表示方式,计算机使用数值的第一位来表示数据的正负。由于有符号位的限制,原码表示法不能正确的表述0,因此有一种补码表示法可以解决+0不等于-0的情况。

先介绍一下反码,反码是二进制源码逐位取反的结果。不过符号位不变。

补码的计算公式(分正数和负数):

1.正数:源码、反码和补码都相同。

2.负数:补码 反码(符号位保持不变) + 1

注意:负数在计算补码的时候,在源码取反的过程中要保留符

号位不变,其他位取反。

例如:10001010取反11110101(第一个1不变)

 

移位运算符:

移位运算符有三种:

1.>> 右移运算符:将二进制数据进行右移运算。

2.<< 左移运算符:将二进制数据进行左移运算。

3.>>> 无符号右移运算符:无论正负,都在高位插入0

示例如下:

public class Yiwei {
public static void main(String[] args) {
System.out.println(8<<2);  //左移两位,尾部加两个0, 即1000----->10 0000
System.out.println(16>>2); //右移两位,尾部去掉两个0,即1 0000----->100
System.out.println(16>>>3); //无符号位右移,在高位补0 即 1 0000---->0001 0,低位的三个0 舍弃
}
}



三目运算符:是一个逻辑判断与赋值运算符的组合。

语法如下:<逻辑表达式> ? <表达式1> : <表达式2>

说明:当逻辑表达式为真时,表达式1有效;当逻辑表达式为假时,表达式2有效。

这里面还有点说道:

  1. 当表达式1和表达式2具有相同的类型时,表达式结果就是这个类型。

  2.当表达式1和表达式2是不同的类型时,表达式结果就是类型范围比较大的那个。

下面给个实例:

public class SanMu {
public static void main(String[] args) {
int  a = 2 > 3 ? 2: 3;
System.out.println("a = "+a );
//int  b = 3.4 > 2.2 ? 2 : 2.3; 因为表达式1和表达式2 的类型不同因此向类型更高的类型转换
double  b = 3.4 > 2.2 ? 2 : 2.3;
System.out.println("b = "+b);
int c = 'c' > 'b' ? 2: 3;
System.out.println("c = "+c);
int d = 'm' > c ? 'c': '3';  //char类型比较小,因此结果值应该转换为int类型
System.out.println("d = "+d);
//这一段代码不会被编译通过,因为表达式1和表达式2的类型不匹配,
//解决办法有两种1是将表达式的值强制转换成String类型,2是将x的类型改为Object类型
//String  x = 1 > 2 ? new Object() : new String("sd"); 
String  x = (String) (1 > 2 ? new Object() : new String("sd")); 
System.out.println(" 第一种方式 x = "+x);
Object  y = 1 > 2 ? new Object() : new String("sd"); 
System.out.println("第二种方式 y = "+y);
}
}
 


运算符通常具有优先级,以便于进行运算。

优先级

描述

运算符

结合性

1
2
2
2 
3


6
7
8
9
10
11
12
13
14

分隔符
对象归类
自增自减运算
逻辑非
算术乘除运算
算术加减运算
移位运算
大小关系运算
相等关系运算
按位与运算
按位异或运算
按位或
逻辑与运算
逻辑或运算
三目条件运算
赋值运算

[ ]  ( )  .  ,  ; 
instanceof
++  --  
!
*  /  % 
+  - 
>> << >>>
<  <=  >  >=
==  !=
&
^
|
&&
||
? :
=

右到左
右到左
右到左
左到右 
左到右 
左到右
左到右
左到右
左到右
左到右
左到右
左到右
左到右
左到右
右到左

 

 二、语句

   语句定义:是程序的基本组成单元,一个软件就是一组语句的有序集合。描述了程序执行的内容。

   语句可以按照结构划分为三种:

    1.顺序结构:按前后顺序执行的语句体。

    2.分支结构:选择执行一部分语句体。

    3.循环结构:循环执行一块语句体。

   2.1  If()语句:是分支结构也是循环结构

   if ( <布尔表达式> ) {

      满足布尔表达式时需要执行的语句体;

    }

2.2 If--- elseif else 语句(中间可以加多个else if中间不能出现为else 而在else 后面有else if )

if( <布尔表达式1> ) {  

    满足布尔表达式1时需要执行的语句体;

} else if ( <布尔表达式2> ) { 

    不满足布尔表达式1,但满足表达式2时需要执行的语句体;

} else {

    不满足布尔表达式1,也不满足表达式2时需要执行的语句体;

}

  2.3 switch 语句的语法:

switch( <整型表达式> ) {  

    case <整型常量1> :

        当整型表达式的值等于整型常量1时执行的语句;

        break;

    case <整型常量2> :

        当整型表达式的值等于整型常量2时执行的语句;

        break;

    case <整形常量3> :

        当整型表达式的值等于整型常量3时执行的语句;

        break;

    default:

        当整型表达式的值不满足任何一个case的值时,执行的语句;

}

2.4  for循环语法(for循环的形式变化多样可以在编译器上打 for然后alt+/ 可以看看for循环的几种形式)

for ( <初始化循环因子>;<布尔型循环条件>;<循环因子步进> ) {

    当循环因子满足布尔型循环条件时执行的语句,

    当前一次循环执行完成后循环因子步进执行,

    然后回到循环体首进行下一次循环;

}

2.5  while 循环语法(注意里面的布尔型循环条件里的类型应该是boolean类型,如果是1,0的话,会报错)

while ( <布尔型循环条件> ) {

    当布尔型循环条件的值为真(true)时,执行的语句,

    直到布尔型循环条件的值为假(false)时,退出循环;

}

2.6  do----while循环语法(该循环至少执行1次)

do {

    执行语句,然后判断布尔型循环条件的值,

    如果为真(true),则继续循环,否则退出循环;

} while ( <布尔型循环条件> );

 

2.7  continue关键字用法:

      continue用于在循环体内,跳过continue之后的代码,回到循

环体首执行下一次循环。

2.8  break关键字用法:

     break用于跳出当前循环体,结束循环。

几点注意:

1 For循环和while循环几乎可以互换,只是在有些场合谁更适合而已,if else同样可以和switch互换。

  For循环因子是在循环体执行后执行的,而且要满足布尔型循环条件,否则for循环会退出。         

       2  For(;;){}代表无限循环,

         while(true){}:代表无限循环

    3.forwhileif,else,可以在程序中相互嵌套使用。

     4.switch里的整型表达式可以用char,int ,long ,byte,short

5.switch里的casebreak可以成对出现,也可以不用,通常可以用switch设计一个简单的菜单程序,

如果有好几个case后面没有break的话会输出这几个case后面的内容。Default是在所有case都不符合的条件下的操作,比如输入不合法的提示,

6while()可以一次都不循环,但是do()while()至少循环一次。所以有时候为了避免不必要的执行,通常用第一种方式

6.for循环中的初始化因子,布尔型变量,和步进因子可以不止一个。

7.可以用break跳出for循环,while循环,同样,可以用continue执行for循环的下一次循环,while循环的下一次循环。

8.当有多重for循环时,break跳出的只是所在的那一重循环,并没有跳出整个循环。Continue同样是执行所在循   环体的下一次循环。

9.Breakcontinue的区别是,break是因为某种条件而终止循环,而continue是因为某种条件而重新执行循环。

10.下面是笔者在做一份网站试题的总结,题目来源:问答网站

    1.研究下面的Java代码:

switch(x) {

  case1: System.out.println(1);

  case2:

  case3: System.out.println(3);

  case4: System.out.println(4);

}

x=2时,运行结果是( 3,4)。

  2.System.out.println(4|3);能打印出什么结果?

答案为 7

3.Java中,类Animal中的方法printA( )定义如下:

public void printA() {

  int a = 10;

  int result = 10%3;

  System.out.println(result);

}

在类Dog中方法printA()定义如下:

public void printA() {

  int a = 10;

  System.out.println(a/3);

}

Dog类的定义如下:

class Dog extends Animal{}.

Animal animal = new Dog();

animal.printA();

以上语句输出为( )

A 0

B 3(Y)

C 2

D 1 

4.以下运算符按运算优先级从高到低排列顺序正确的是______

A !=,*,&&,>=

B !,*,<,= (Y)

C !,=,*,>=

D !,*,&&,>=

 

5.关于whiledowhile循环,下列说法正确的是

这些都不对。

while语句不同的是,do-while语句的循环至少执行一次(Y)

C do-while语句首先计算终止条件,当条件满足时,才去执行循环体中的语句

两种循环除了格式不通外,功能完全相同

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值